home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / Mm2_txt / MODULA2F.TXT < prev    next >
Encoding:
Text File  |  1997-02-07  |  174.3 KB  |  3,421 lines

  1. 2.1  Bedienung: Los geht's                                                2 -  1
  2. ________________________________________________________
  3.  
  4.  
  5. 2.      Bedienung  des  Systems
  6.  
  7.  
  8. Wir haben uns bemüht, die Verwendung von Fremdwörtern zu vermeiden oder
  9. diese  mit  Übersetzungen  zu  versehen.  Aber  gerade  im  Computerjargon
  10. kommen viele aus dem Englischen übernomme Ausdrücke vor, die kaum direkt
  11. übersetzbar sind oder Einsteigern gar nicht bekannt sein können. Stoßen Sie in
  12. diesem Handbuch auf solche Ausdrücke, sehen Sie doch einfach nach, ob wir
  13. dazu eine Begriffserläuterung im Anhang dieses Buchs  nachgetragen  haben.
  14. Wir haben uns bemüht, diese Ausdrücke kursiv hervorzuheben.
  15.  
  16.  
  17. 2.1    Los  geht's  -
  18.           Installieren  und  Ausprobieren
  19.  
  20.  
  21. Voraussetzungen
  22.  
  23. Wir gehen davon aus, daß Sie vor Ihrem Atari ST-Computer sitzen und neben
  24. diesem  Handbuch  die  mitgelieferten  Disketten  zur  Hand  haben.  (Die  Regi~
  25. strierkarte, die der Lieferung beilag, haben Sie bestimmt schon ausgefüllt, um
  26. in den Genuß aller Updates und Erweiterungen zu Megamax Modula zu kom~
  27. men?)
  28.  
  29. Außerdem sollten Sie einige leere Disketten bereithalten, um Backup- (Sicher~
  30. heits-) und Arbeitskopien anzulegen: 4 doppelseitige Disketten  für  Backups;
  31. zusätzlich 2 Disketten für die Zusammenstellung maßgeschneiderter Arbeits~
  32. disketten. (Natürlich genügt auch etwas Platz auf einer Festplatte...)
  33.  
  34. Einige Worte zur Konfiguration des Rechners: Für ein komfortables Arbeiten
  35. mit Megamax Modula ist eine freie RAM-Kapazität von  2  MByte  und  einer
  36. Festplatte wünschenswert.
  37.  
  38. Die Benutzung von Megamax Modula auf einem Atari mit nur 512 KByte RAM
  39. ist nicht möglich. Voraussetzung dafür wäre eine gegenüber der mitgelieferten
  40. stark verkleinerte Shell, die kein GEM benutzt.  Eine  solche  Shell  ist  zwar
  41. schnell erstellt, aber wir weisen lieber darauf hin, den Atari auf mindestens
  42. 1 MByte aufzurüsten. In den Fachzeitschriften lassen sich einfach einzubauende
  43. Speichererweiterungen schon für ca. DM 300.- finden.
  44. 2.1  Bedienung: Los geht's                                                2 -  2
  45. ________________________________________________________
  46.  
  47.  
  48. Die Modula-Disketten
  49.  
  50. Die Aufteilung und Anzahl der mitgelieferten Disketten variiert von Zeit zu Zeit,
  51. so daß wir Ihnen hier nur alle zumindest vorhandenen Dateien und Ordner auf~
  52. zeigen, um Ihnen die Übersicht zu erleichtern. In der Regel werden die Disket~
  53. ten zweiseitig beschrieben - wenn Sie sie nicht in den Computer einlesen kön~
  54. nen, wenden Sie sich bitte an Ihren Händler, damit er Ihnen die Disketten auf
  55. einseitige umkopiert, oder an Application Systems. Über weitere Besonderheiten
  56. und zusätzliche Dateien werden Sie in der Datei LIESMICH.TXT informiert, die
  57. sich auf einer der Disketten befindet.
  58.  
  59.     GEP ED           Ordner, der den Gepard-Editor enthält:
  60.          _
  61.        GEP ED.MOD     Der Gepard-Editor (nur unter der Shell zu starten!)
  62.            _
  63.  
  64.     GME               Ordner; enthält die Dateien für den Editor "GME"
  65.        GME.MOD         Der Editor
  66.        ...IMP              Zum GME gehörende Module
  67.        GMEMENUE.RSC  Die GEM-Resource-Datei für den GME
  68.  
  69.     SRC               Ordner mit Quelltexten. Enthält vier Ordner für:
  70.        D                  Definitions-Texte. Achtung: Sind ggf. erst zu dekom-
  71.                            primieren (siehe HINWEIS-Text auf der Diskette)
  72.        DEMO             Diverse Demonstrationsprogramme
  73.        MOS              Quellen zum Megamax-System, die Sie bei Bedarf
  74.                            selbst modifizieren können (z.B. die Shell)
  75.        UTILITY           Diverse Hilfsprogramme
  76.  
  77.     SYS               Ordner mit Modulen und anderen Systemdateien:
  78.        IMP                Ordner mit den übersetzten Implementations-Modulen
  79.                            (werden beim Ausführen vieler Programme unter der
  80.                            Shell benötigt)
  81.        MOD              Ordner mit Compiler, Linker, Make usw.
  82.        DEF               Ordner mit übersetzten Definitions-Modulen (werden
  83.                            vom Compiler beim Übersetzen benötigt):
  84.          MM2DEF.M2L     Enthält die unveränderlichen DEF-Module der Mega-
  85.                              max-Bibliothek in komprimierter Form.
  86.          MM2SHELL.DEF   Ein einzelnes DEF-Modul: Es definiert die Resource-
  87.                              Indices der Shell und kann sich ändern, wenn die
  88.                              GEM-Resource modifiziert wird.
  89.        MODULA.ERR      Textdatei mit Fehlermeldungen für den Compiler
  90.  
  91.     USER              Ordner für Ihre eigenen (Quelltext-) Dateien.
  92.        DEF               Hier kommen übersetze Definitions-Module rein
  93.        IMP                Dito für Implementations-Module
  94.        MOD              Dito für Haupt-Module
  95.                         Die Quelltexte sollten auch hier im Ordner USER abgelegt
  96.                         werden.
  97. 2.1  Bedienung: Los geht's                                                2 -  3
  98. ________________________________________________________
  99.  
  100.  
  101.     TMP               Ordner, in dem die Shell interne Dateien zwischenzeitlich
  102.                         ablegt (auch das Make-Programm!).
  103.  
  104.     TEMPLMON.Vxx   Ordner mit Maschinensprache-Monitor.
  105.  
  106.     MM2SHELL.PRG   Die Modula-Shell (Bedienungsoberfläche)
  107.     MM2SHELL.RSC   GEM-Resource-Datei für die Shell
  108.     MM2SHELL.RSD   Zusatzdatei zur Resource-Datei
  109.     MM2SHELL.M2P   Parameter-Datei für die Shell
  110.     MM2SHELL.M2B   Batch-Datei - wird beim Shell-Start ausgeführt
  111.     MM2SHELL.HLP   Textdatei mit Hilfestellungen für die Shell-Bedienung
  112.  
  113.     LIESMICH.TXT     Diese Datei unbedingt lesen! (z.B. nach dem Shell-Start
  114.                         durch einen Doppelklick in den Editor laden)
  115.  
  116.     NRSC ASH.PRG   Programm zum Bearbeiten von GEM-Resourcen
  117.           _
  118.     NRSC.RSC         Resource-Datei zum Programm
  119.            Das  "Resource  Construction"-Programm  wird  zur  Erstellung  von
  120.            GEM-Menues und anderen GEM-Objekten benötigt. Mehr dazu finden
  121.            Sie in den Kapiteln 5 und C.2.
  122.  
  123.     HD INST.PRG     Hiermit  kann  das  Modula-System  bequem  auf  der
  124.        _
  125.                         Festplatte installiert werden.
  126.  
  127.     DEMO enthält einige Beispielprogramme, die Ihnen vielleicht den Einstieg in
  128.     Megamax Modula erleichtern. In UTILITY finden sich einige Hilfsprogramme,
  129.     die Sie compilieren sollten, um dann die erzeugten Code-Dateien auf ihre
  130.     Arbeitsdisk (Ordner SYSüMOD) zu kopieren. Sehen Sie sich  alle  diese
  131.     Dateien an, z.B., indem Sie sie in den Editor laden. Sie enthalten alle eine
  132.     Information zu Beginn des Textes.
  133.  
  134.     Der Ordner MOS ist eher für fortgeschrittene Benutzer interessant: Er
  135.     enthält die Quelltexte einiger Module, die Sie verändern können, um die
  136.     Konfiguration der Bibliotheken und der Entwicklungsumgebung (Shell) Ihren
  137.     eigenen Wünschen anzupassen.
  138.  
  139.     Besonders hilfreich ist der Ordner D. Er enthält die Definitionstexte, die
  140.     auch  im  Kapitel  B  dieses  Handbuchs  abgedruckt  sind.  Aus  Erfahrung
  141.     wissen wir, daß man oft Funktionen nachschlagen will und es dann beim
  142.     üblichen Schreibtischchaos recht  unbequem  ist,  im  Handbuch  herumzu~
  143.     blättern. Wenn Sie genügend Massenspeicher (Festplatte) haben, reicht es
  144.     nun  aus,  im  Editor  ein  neues  Fenster  zu  öffnen  und  den  benötigten
  145.     Definitionstext hineinzuladen. Der  Gepard-Editor  erlaubt  es  sogar,  nach
  146.     exportierten Bezeichnern zu suchen und dann die entsprechende Definitions-
  147.     Textdatei  anzuzeigen  (mit  der  F6-Taste,  wenn  der  Cursor  auf  dem
  148.     gesuchten Bezeichner steht!).
  149. 2.1  Bedienung: Los geht's                                                2 -  4
  150. ________________________________________________________
  151.  
  152.  
  153. Installieren von Megamax Modula
  154.  
  155. Auf die Gefahr hin, daß wir Sie langweilen: Haben Sie schon Backup-Kopien
  156. aller gelieferten Disketten gemacht? Die Disketten sind nicht kopiergeschützt.
  157. Es  sollte  also  keine  Schwierigkeiten  bereiten,  Kopien  anzufertigen  und  die
  158. Originale in Sicherheit zu bringen. Vorsicht: Vor dem Kopieren sollten Sie die
  159. Originale schreibschützen (Loch ist offen), um sie bei einer Verwechslung nicht
  160. gleich zu löschen!
  161.  
  162. Mit den Kopien in der Hand können Sie sich jetzt Ihre Arbeitsdisketten zusam~
  163. menstellen. Wir beschreiben zwei verschiedene Rechner-Konfigurationen:
  164. * Atari ST mit mindestens 1 MByte RAM, mindestens 720 KByte Diskettenplatz
  165. * Atari ST mit mindestens 1 MByte RAM, Festplatte
  166.  
  167.  
  168. Atari ST mit mindestens 1 MByte RAM, mindestens 720 KByte Diskettenplatz
  169.  
  170. Die gelieferten Disketten sind bereits sinnvoll aufgeteilt. Auf der Disk mit der
  171. Shell   befinden   sich   neben   den   für   die   Shell   notwendigen   Dateien
  172. (MM2SHELL.M2P,  MM2SHELL.M2B,  MM2SHELL.RSC)  auch  die  Module,  die
  173. resident  geladen  werden:  der  Compiler  (im  SYSüMOD-Ordner)  und  beide
  174. Editoren (Ordner GEP ED bzw. GME). Die andere Diskette enthält dann die
  175.                        _
  176. zum Arbeiten benötigten Dateien, wie  Definitions-Codes  (MM2DEF.M2L)  und
  177. importierte Module (Ordner SYSüIMP). Ihre selbst übersetzten Dateien werden
  178. im USER-Ordner abgelegt, worin Sie auch Ihre Quelltexte ablegen können.
  179.  
  180. Sie können also die Shell von der einen Diskette starten; ist sie fertig, kann
  181. die  andere  Disk  eingelegt  werden,  um  dann  eigene  Programme  oder  die
  182. mitgelieferten Programme in den Ordnern DEMO und UTILITY zu übersetzen
  183. und zu starten.
  184.  
  185. Beachten  Sie  aber,  daß  die  Parameter-Datei  der  Shell  auf  der  Boot-Disk
  186. abgelegt ist. Wenn Sie den Menüpunkt Parameter ...speichern wählen oder die
  187. Parameter beim Verlassen der Shell speichern wollen, müssen Sie zuvor die
  188. Boot-Disk einlegen. Es passiert zwar nichts schlimmes, wenn Sie dies nicht
  189. befolgen, allerdings würde beim erneuten Start der Shell von der Boot-Disk
  190. wieder die alte Parameter-Datei geladen werden. Notfalls können Sie die Datei
  191. auch einfach auf die Boot-Disk zurückkopieren.
  192.  
  193. Ein ähnliches Disketten-Problem entsteht bei der  Benutzung  des  GME.  Der
  194. Editor benötigt beim Start seine Resource-Datei GMEMENUE.RSC. Wenn Sie
  195. nur ein Laufwerk haben, müssen Sie aufpassen, daß beim Start des Editors
  196. eine Disk mit dieser Datei im Ordner  GME  einliegt.  Wollen  Sie  Texte  von
  197. anderen Disketten vom Laufwerk A: lesen, müssen Sie erst den Editor starten
  198. (Tastendrücke:  Control-P,  Esc,  Return,  Control-E)  und  erst  dann  die  Disk
  199. wechseln und im Editor die gewünschte Datei laden.
  200. 2.1  Bedienung: Los geht's                                                2 -  5
  201. ________________________________________________________
  202.  
  203.  
  204. Besser ist es dann schon, zwei Laufwerke zu verwenden - dann braucht auch
  205. die Boot-Disk mit der Shell und ihrer Parameter-Datei nicht entfernt werden,
  206. so daß das vorher beschriebene Problem ebenfalls nicht entsteht. Allerdings
  207. müssen dazu erst einige Parameter in der Shell und die Suchpfade geändert
  208. werden.
  209.  
  210. Müssen aus Platzmangel mal  die  geladenen  Programme  (z.B.  Compiler  und
  211. Editor) entfernt werden, werden sie bei erneuter Benutzung auf der gerade
  212. eingelegten Diskette gesucht. Ggf. müssen Sie sich Editor und Compiler dazu
  213. auf die Arbeitsdisk kopieren, damit Sie nicht jedesmal extra die Disk mit der
  214. Shell wieder einlegen müssen.
  215.  
  216. Das Programm HD INST.PRG auf einer der Disketten wird beim Arbeiten nicht
  217.                    _
  218. benötigt und kann daher von dort entfernt werden, um Platz auf der Disk zu
  219. gewinnen.
  220.  
  221. Um das Modula-System nach Ihren Wünschen zu konfigurieren, lesen Sie bitte
  222. über die Parameter von Shell, Editor  und  Compiler  sowie  über  die  Batch-
  223. Dateien für die Suchpfad-Bestimmung in Kapitel 2.2 nach.
  224.  
  225. Im  Ordner  MAXIDISK.4MB  finden  Sie  eine  RAM-Disk,  die  sogar  die  darin
  226. gespeicherten Daten komprimieren kann. Sobald Sie mit der  Bedienung  und
  227. Konfiguration  vertraut  sind,  können  Sie  sich  eine  Boot-Disk  erstellen,  die
  228. automatisch die RAM-Disk einrichtet und die von Ihnen benötigten Definitions~
  229. module sowie die Fehlerdatei MODULA.ERR in die RAM-Disk kopiert. Wenn Sie
  230. dann  die  Suchpfade  entsprechend  einstellen,  können  Sie  das  Übersetzen
  231. erheblich beschleunigen.
  232.  
  233.  
  234. Atari ST mit mindestens 1 MByte Speicher und Festplatte
  235.  
  236. Hier ist alles ganz einfach. Sie brauchen lediglich auf der Festplatte irgendwo
  237. einen Ordner für das  Modula-System  anzulegen  ("MM2"  wäre  ein  schöner
  238. Name) und dann alle Dateien, so wie sie auf den Disketten angeordnet sind,
  239.                                                           1
  240. hineinzukopieren. Auf der Festplatte sollten dazu ca. 3 /  MB frei sein. Damit
  241.                                                             2
  242. es  auch  dabei  keine  Schwierigkeiten  gibt,  haben  wir  das  Programm
  243. HD INST.PRG  vorbereitet.  Es  braucht  nur  gestartet  zu  werden  und  dann
  244.    _
  245. sollten Sie, wie vom Programm aufgefordert, die vier Disketten nacheinander
  246. einlegen. Dann werden einfach alle Dateien auf die Festplatte kopiert. Weitere
  247. Konfigurationen  brauchen  erstmal  nicht  vorgenommen  werden.  Sie  sollten
  248. später aber noch die Definitions-Module in der Library decomprimieren. Lesen
  249. Sie dazu Kapitel 2.4.
  250.  
  251. Schon ist alles vorbereitet - die Shell kann nun gestartet werden. Erst, wenn
  252. Sie die Strukturen der Ordner ändern wollen, müssen Sie die Parameter in
  253. der Shell und die Suchpfade im Batch (MM2SHELL.M2B) anpassen. Doch dazu
  254. sollten Sie erstmal Kapitel 2.2 durchlesen!
  255. 2.1  Bedienung: Los geht's                                                2 -  6
  256. ________________________________________________________
  257.  
  258.  
  259. Speicherplatzmangel?!
  260.  
  261. Wenn  Sie  nun  die  Shell  starten,  sollten  nach  dem  Laden  von  Compiler
  262. und  Editor  mindestens  noch  200  KB  (ca.  200.000  Byte)  Speicher  frei
  263. sein,  sonst  werden  sich  bald  Compiler,  Editor  oder  Linker  diesbezüglich
  264. beschweren.  Vor  allem,  wenn  Sie  ein  Fan  von  Accessories  oder  AUTO-
  265. Ordner-Programmen sind und Ihr Rechner nur über 1 MB Speicher verfügt,
  266. kann es dazu kommen. Den noch freien Speicher können Sie über den Menü~
  267. punkt Info/Umgebungsinformationen erfahren.
  268.  
  269. Sie haben bei zu knappem Speicher keine Datenverluste zu befürchten! Reicht
  270. der Speicher im Editor nicht mehr, kann immer noch der bisher erzeugte Text
  271. gesichert werden, bei Compiler, Linker und anderen Dienstprogrammen kann
  272. die  Operation  ja  sowieso  wiederholt  werden.  Um  den  freien  Speicher  zu
  273. vergrößern, haben Sie verschiedene Möglichkeiten:
  274.  
  275. * Geben Sie die sonst noch geladenen Programme aus dem Speicher frei (das
  276.   zu startende Programm selbst braucht nicht entfernt werden). Dazu öffnen
  277.   Sie das Resident-Fenster (Taste R) und ziehen die angezeigten Programme
  278.   in den Abfalleimer. Dauerhaft können Sie auf das  Laden  der  Programme
  279.   ganz  verzichten,  indem  Sie  die  Load-Anweisungen  aus  dem  Shell-Batch
  280.   entfernen (siehe Kapitel 2.2).
  281.  
  282. * Verwenden Sie den Gepard-Editor. Er benötigt und belegt (als residentes
  283.   Programm)  deutlich  weniger  Speicher  als  der  GME.  Ersetzen  Sie  dann
  284.   die  Anweisung  LOAD  GME  durch  LOAD  GEP ED  in  der  Batch-Datei
  285.                                                       _
  286.   MM2SHELL.M2B. Diese Änderung kann mit dem Editor durchgeführt werden.
  287.  
  288. * Verzichten  Sie  auf  andere  residente  Programme,  wie  Accessories  oder
  289.   AUTO-Ordner-Programme (z.B. Cache).
  290.  
  291. * Starten Sie den Compiler bzw. den Linker als gelinktes Programm von einer
  292.   anderen Shell aus. Diese Lösung ist zwar nicht so komfortabel wie mit der
  293.   Megamax-Shell, aber löst dafür auch die größten Platzprobleme. Siehe dazu
  294.   die Erläuterungen in den Quelltexten von LinkInit und CompInit (LINKINIT.M &
  295.   COMPINIT.M im UTILITY-Ordner).
  296. 2.1  Bedienung: Los geht's                                                2 -  7
  297. ________________________________________________________
  298.  
  299.  
  300. Mehr Geschwindigkeit...
  301.  
  302. Haben Sie keine Platzprobleme, können Sie Ihr System auf Geschwindigkeit
  303. trimmen. Hier einige Tips:
  304.  
  305. Wenn Sie eine Festplatte haben, verwenden Sie unbedingt TOS 1.4 (Rainbow-
  306. TOS, enthält u.A. die Zahl 1989 in der Info-Box des Desktops) oder höher. Die
  307. älteren TOS-Versionen sind sehr, sehr langsam beim Speichern und Laden.
  308. Das TOS 1.4 gibt es bei fast jedem Atari-Händler; oder sehen Sie mal in die
  309. Kleinanzeigen der Computerzeitschriften.
  310.  
  311. Haben Sie TOS 1.4 (oder höher), verwenden Sie das Cache-Programm von
  312. Atari! Es heißt beispielsweise CACHE90.PRG und gehört in den AUTO-Ordner.
  313. Gegenüber den meisten  anderen  Caches  puffert  dieser  nicht  wahllos  jeden
  314. Sektor,  sondern  gezielt  FAT  und  Verzeichnisse.  Da  Megamax  Modula-2
  315. intensiver als jedes andere Programm auf die Verzeichnisse zugreift, macht
  316. sich der Atari-Cache hier besonders gut bemerkbar. Zudem: Da es im Grunde
  317. kein Disk-Treiber ist, sondern lediglich die Puffer des GEMDOS erweitert, ist
  318. es prinzipbedingt jedem anderen Cache überlegen.
  319.  
  320. Wie gesagt, Megamax Modula-2 greift häufig auf die Dateiverzeichnisse zu, um
  321. Modulcodes  und  -definitionen  zu  laden.  Deshalb  sollten  die  am  häufigsten
  322. benötigten Dateien möglichst schnell gefunden werden. Dazu sollten  Sie  die
  323. Suchpfade entsprechend ordnen: Am Besten wäre es, wenn sich alle Dateien
  324. im jeweils ersten Suchpfad befänden.
  325.  
  326. Sie sollten die  Definitionsdateien  in  der  Bibliothek  MM2DEF.M2L  entpacken.
  327. Mehr dazu im Kapitel 2.4.
  328.  
  329. Überhaupt  genießt  die  Bibliotheksdatei  einen  Sonderstatus:  Beim  Start  des
  330. Compilers  wird  sie  einmal  geöffnet,  das  gesamte  Verzeichnis  wird  in  den
  331. Speicher  geladen.  Die  darin  befindlichen  Dateien  werden  am  Schnellsten
  332. gefunden.  Sie  können  Ihre  eigenen  Definitionsmodule  auch  in  diese  Datei
  333. einfügen (mit dem LibManager, s. Kap. 2.4).
  334.  
  335. Benutzen  Sie  Turbo  ST  oder  Quick  ST.  Dies  sind  Programme,  die  die
  336. GEM-Bildschirmausgaben um ein Vielfaches beschleunigen. Wir empfehlen Ihnen
  337. Quick  ST,  das  auch  Erweiterungen  wie  Hyperscreen/Overscan  und  GDOS
  338. unterstützt. Sie erhalten Quick ST gegen Einsendung eines Schecks über 25
  339. US Dollar bei folgender Adresse:
  340.  
  341.         Branch Always Software
  342.         14150 N.E. 20th St. #302
  343.         Bellevue
  344.         WA 98007
  345.         USA
  346. 2.1  Bedienung: Los geht's                                                2 -  8
  347. ________________________________________________________
  348.  
  349.  
  350. Namenskonventionen
  351.  
  352. Falls Sie schon mit anderen Modula-2-Systemen gearbeitet haben, wollen wir
  353. Sie gleich darauf hinweisen, daß wir  andere  Endungen  bei  den  Dateinamen
  354. verwenden. Die Quelltexte haben alle nur einen Buchstaben als Endung, und
  355. zwar M für Haupt-, I für Implementations- und D für Definitionsmodule. Die
  356. entsprechenden Code-Dateien haben  MOD,  IMP  bzw.  DEF  als  Endung.  Der
  357. Name der Code-Datei wird nicht aus dem der Quelldatei gebildet, sondern aus
  358. den ersten acht Buchstaben des Modulnamens, der im Quelltext steht.
  359.  
  360. Wenn Sie gerne andere Endungen verwenden wollen, brauchen Sie lediglich die
  361. Variablen im Quelltext der Shell (MM2SHELL.M) zu ändern (suchen Sie dort
  362. nach den z.Zt. verwendeten Endungen), übersetzen und die Shell neu zu linken
  363. (siehe dazu Kapitel 2.6). Natürlich müssen Sie auch noch die Endungen der
  364. mitgelieferten Dateien alle ändern, auch die in der Library (MM2DEF.M2L).
  365.  
  366.  
  367. Mathe-Koprozessor (FPU, SFP004, Atari TT)
  368.  
  369. Während der Atari TT serienmäßig über eine FPU verfügt, können Sie sie beim
  370. Atari ST/STE nachrüsten (z.B. SFP004 von Atari). Beim ST wird in der Regel
  371. ein 68881, beim TT ein 68882 eingesetzt. Beide sind weitgehend identisch, so
  372. daß wir beim Prozessortyp keine Unterschiede machen brauchen.
  373.  
  374. Allerdings wird eine FPU im ST anders angesteuert als im TT. Aus Gründen,
  375. die im Kapitel über den Compiler (Kap. 3.4,  F-Direktive)  weiter  ausgeführt
  376. werden, müssen Sie die Shell bzw. alle gelinkten Programme mit den dafür
  377. angepaßten FPU-Modulen binden, um die FPU auch nutzen zu können. Dazu
  378. verwenden Sie je nach Rechnertyp die Module aus den Ordnern ST FPU bzw.
  379.                                                                        _
  380. TT FPU.
  381.    _
  382.  
  383. Das einfachste ist, die Module aus einem der Ordner in den IMP-Ordner zu
  384. kopieren.  Dabei  werden  allerdings  die  "normalen"  Module,  die  keine  FPU
  385. benutzen, überschrieben. Wenn Sie schon mit  der  Änderung  der  Pfadlisten
  386. vertraut sind, tragen Sie besser den passenden FPU-Ordner als jeweils ersten
  387. Suchpfad bei DefaultPath und ImpPath ein. Dann werden die Dateien dieses
  388. Ordners bevorzugt verwendet.
  389.  
  390. Linken  Sie  dann  die  Shell  neu,  damit  Programmodule,  die  unter  der  Shell
  391. übersetzt und per Loadtime-Linking  gestartet  werden,  auch  gleich  die  FPU
  392. mitbenutzen können. Wie Sie die Shell linken, erfahren Sie in Kapitel 2.6; oder
  393. starten Sie einfach den Batch LINKSHEL.M2B.
  394.  
  395. Mit den FPU-Modulen gelinkte Programme können Sie nicht auf Rechnern ohne
  396. die entsprechende Hardware einsetzen! Sie werden dann eine Fehlermeldung
  397. erhalten.
  398. 2.1  Bedienung: Los geht's                                                2 -  9
  399. ________________________________________________________
  400.  
  401.  
  402. Ein erstes Programm
  403.  
  404. Um Megamax Modula richtig nutzen zu können, sollten Sie als nächstes die
  405. Kapitel 2.2 (Shell), 2.3 (Editor) und 2.4 (Compiler) lesen. Bevor Sie größere
  406. Programme schreiben, verdient auch Kapitel 3 Ihre Aufmerksamkeit. Aber viel~
  407. leicht sind Sie im  Moment  einfach  neugierig,  ob  Ihr  neues  Modula-System
  408. überhaupt funktioniert? Dann tun Sie doch erstmal folgendes...
  409.  
  410. Shell starten
  411.  
  412. Bereiten  Sie  den  Atari  vor,  wie
  413. oben für Ihre Rechner-Konfiguration
  414. beschrieben, und legen Sie ggf. die
  415. Diskette  mit   MM2SHELL.PRG   in
  416. Laufwerk   A   ein.   Starten   Sie
  417. MM2SHELL.PRG     durch     einen
  418. Doppelklick.  Nach  einiger  Zeit  er~
  419. scheint eine Arbeitsfläche, die dem
  420. GEM-Desktop ähnelt:
  421.  
  422. Programm eingeben
  423.  
  424. Auf der Arbeitsfläche finden Sie unter anderem eine Box Aktuelle Datei. Im
  425. Namensfeld sollte hinter TEXT kein Name stehen. Um dies ggf. zu erreichen,
  426. können  Sie  das  Feld  doppelt  anklicken  oder  Control-P  drücken.  Daraufhin
  427. können Sie dann einen Text eingeben - drücken Sie Esc und dann Return als
  428. Bestätigung. Dann ist das Feld der Aktuellen Datei leer.
  429.  
  430. Nun soll der Editor gestartet werden. Dazu halten Sie entweder
  431. die  rechte  Maustaste  gedrückt,  während  mit  der  linken  das
  432. Editieren-Symbol  doppelt  angelickt  wird,  oder  Sie  drücken
  433. Control-E. Damit wird die - leere - aktuelle Datei bearbeitet.
  434.  
  435. Geben Sie nun das folgende Programm im Editor ein - bitte mit korrekter
  436. Groß- und Kleinschreibung!
  437. 2.1  Bedienung: Los geht's                                                2 - 10
  438. ________________________________________________________
  439.  
  440.  
  441.  
  442. Programm sichern
  443.  
  444. Wenn     das     komplette
  445. Programm   eingegeben   ist,
  446. fahren Sie mit der Maus den
  447. Menüpunkt  Datei  an,  und
  448. wählen  Sie  den  Unterpunkt
  449. Sichern  oder  Sichern  als.
  450. Damit  wird  die  Datei  im
  451. Speicher wieder zurück auf
  452. Disk geschrieben.
  453.  
  454.  
  455.                                              Da  dem  Editor  aber  bisher  noch
  456.                                              kein  Name  für  die  Datei  bekannt
  457.                                              war,  fragt  er  zuerst  danach.  Es
  458.                                              erscheint  der  GEM-Datei-Selektor,
  459.                                              in  dem  nun  ein  Name  für  den
  460.                                              Programmtext     anzugeben     ist.
  461.                                              Nehmen   wir   ERSTESPR.M   und
  462.                                              speichern es im Ordner USER.
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469. Nun kann der Editor verlassen werden. Dazu ist
  470. entweder Alternate-X zu drücken oder im Menü
  471. Beenden anzuwählen.
  472.  
  473.  
  474.  
  475.  
  476. Programm übersetzen
  477.  
  478. Damit  von  nun  an  in  der  Shell
  479. das Ansprechen der Datei einfacher
  480. wird,  machen  wir  das  Modul  zur
  481. Arbeitsdatei, indem N gedrückt oder
  482. der  entsprechende  Menüpunkt  in
  483. der Shell angewählt wird.
  484.  
  485. Nun ist ein kleines Feld auf dem Desktop der Shell erschienen. Darin soll der
  486. Name der Textdatei eingetragen werden. Dies kann manuell durch die Taste P
  487. oder durch einen Doppelklick auf das Feld vorgenommen werden.
  488. 2.1  Bedienung: Los geht's                                                2 - 11
  489. ________________________________________________________
  490.  
  491.  
  492. Bequemer ist es allerdings erstmal,
  493. wenn  Sie  das  Verzeichnis  vom
  494. Laufwerk  mit  der  Datei   öffnen
  495. (Doppelklick  auf  das  Disk-Symbol)
  496. und  dann  die  Datei,  wie   beim
  497. Kopieren, auf das Feld ziehen.
  498.  
  499. Nun genügt ein Doppelklick auf das Ausführen-Symbol oder ein
  500. Druck auf die Taste A, um das Programm zu übersetzen und
  501. dann zu starten (natürlich kann das Übersetzen auch erst durch
  502. einen  separaten  Compiler-Aufruf  erreicht  werden).  Der  Compiler  wird
  503. gestartet und zeigt in etwa folgendes Bild:
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514. Nehmen wir aber  vorsichtshalber  an,  daß  das  Programm  nicht  auf  Anhieb
  515. fehlerfrei ist. In diesem Fall wird der Editor automatisch aufgerufen und zeigt
  516. Ihnen mit dem Cursor die Fehlerposition an. Außerdem ist oben in invertierter
  517. Schrift die Fehlermeldung des Compilers zu sehen. Korrigieren Sie den Text,
  518. und  gehen  Sie  dann  erstmal  wieder  vor,  wie  schon  beschrieben  (Text
  519. speichern, Editor verlassen, Programm ausführen/übersetzen).
  520.  
  521. Zur Ausführung des Programms ist eigentlich nicht viel zu sagen:  Daß  die
  522. Ausgaben in ein Fenster geschrieben werden, haben Sie schon selbst bemerkt.
  523. Vielleicht haben Sie auch schon ausprobiert, daß das Fenster vergrößert und
  524. verschoben werden kann, wie Sie das so kennen? Die Standardausgaben (über
  525. das Modul InOut) führen immer auf dieses Standard-Fenster, solange Sie un~
  526. ter der Shell arbeiten (und nicht TOSIO extra importieren). Zusätzlich steht
  527. ein Window-Modul zur Verfügung, mit dem Sie auch mehrere Fenster beliebi~
  528. ger Größen handhaben können. (Außerdem gibt's ein Terminal-Modul, das ohne
  529. Fenster arbeitet.)
  530. 2.1  Bedienung: Los geht's                                                2 - 12
  531. ________________________________________________________
  532.  
  533.  
  534. Nun wollen wir das Programm erweitern. Wir befinden uns in
  535. der Shell. Dort aktivieren Sie erneut den Editor. Das geht nun
  536. entweder durch Doppelklick auf das Editieren-Symbol oder die
  537. Taste E.
  538.  
  539. Zurück im Editor, ändern Sie die WriteString-Anweisungen:
  540.  
  541.  
  542.  
  543. Nun soll erneut übersetzt werden. Dies könnte mit dem Menüpunkt Ende &
  544. Comp veranlaßt werden: Der Editor speichert den Text automatisch, und der
  545. Compiler beginnt mit der Übersetzung. Aber es geht auch noch schneller: Der
  546. Editor erlaubt  es,  den  Compiler  zu  starten,  ohne  den
  547. Text zu speichern und den Editor zu verlassen. Allerdings
  548. wird  dann  auch  mehr  Speicherplatz  benötigt.  Diese
  549. Funktion  wird  im  Menü  durch  Compilieren  oder  durch
  550. Drücken von Alternate-D aktiviert. Wenn allerdings der
  551. Speicher  zum  Übersetzen  nicht  ausreicht,  meldet  der  Compiler  einen
  552. entsprechenden  Fehler  und  Sie  müssen  mit  der  Funktion  Ende  &  Comp.
  553. vorliebnehmen.
  554.  
  555. Nun wird der Compiler aber einen Fehler melden: Der Cursor steht auf dem
  556. Wort Space, und die Meldung oben weist darauf hin, daß dieser Bezeichner
  557. unbekannt ist. Er muß natürlich erst importiert werden. Dazu fügen Sie hinter
  558. dem InOut-Import noch folgende Zeile ein:
  559.  
  560.  
  561.  
  562. Wenn Sie wieder den Compiler starten, sollte er diesmal alles ohne Fehler
  563. übersetzen. Verlassen Sie diesmal den Editor mit dem Befehl Ende & Ausf.
  564. (Tastenbefehl:  Alternate-A).  Der  Text  wird  automatisch  gespeichert,  der
  565. Compiler übersetzt das Programm (wenn Sie das nicht schon vorher im Editor
  566. getan haben), und dann wird das Programm ausgeführt.
  567.  
  568. Wenn Ihr Spieltrieb noch nicht erschöpft ist, können Sie ja mal einen Lauf~
  569. zeitfehler im Programm erzwingen (beispielsweise durch eine Division  durch
  570. Null) - was dann passiert, können Sie im Kapitel 2.5 nachlesen.
  571.  
  572. Spaßeshalber können Sie auch mal das Make (s. Kapitel 2.7) ausprobieren:
  573. Aktivieren Sie im Tools-Menü der Shell das Programm ModRef, oder drücken
  574. Sie dazu die Taste F1. In der dann erscheinenden Selektor-Box wählen Sie ein
  575. Programmodul aus, z.B. das neu erstellte ERSTESPR.M oder auch eines aus
  576. dem DEMO- oder UTILITY-Ordner. Das Programm wird dann nach kurzer Zeit
  577. wieder die Selektor-Box zeigen, worauf Sie entweder  noch  weitere  Module
  578. auswählen oder das Programm durch Klick auf den Abbruch-Knopf beenden. Es
  579. wurde nun eine Datei mit der Endung M2M in dem Verzeichnis erzeugt, wo Sie
  580. das erste Modul ausgewählt haben.
  581. 2.1  Bedienung: Los geht's                                                2 - 13
  582. ________________________________________________________
  583.  
  584.  
  585. Suchen Sie die Datei mit der Endung M2M im Inhaltsverzeichnis, und ziehen
  586. Sie  sie  dann  auf  das  Ausführen-Symbol.  Erst  wird  das  Make-Programm
  587. gestartet,  dann  werden  alle  Module,  die  Sie  vorher  ausgewählt  hatten,
  588. übersetzt und daraufhin das erste Hauptmodul gestartet. Wiederholen Sie dies,
  589. wird  das  Modul  gestartet,  ohne  erneut  übersetzt  zu  werden  -  das  Make
  590. erkennt, daß die Module bereits übersetzt sind.
  591.  
  592. Allerdings hat die Anwendung des Make hier noch keinen großen Sinn - bei
  593. einzeln zum Ausführen gebrachten Dateien funktioniert diese  Erkennung,  ob
  594. das Modul schon übersetzt ist, sowieso schon direkt von der Shell aus ohne
  595. Verwendung des Make. Und alle Module, die importiert werden, sind Bestand~
  596. teile des Megamax-Systems und deshalb auch schon übersetzt. Erst, wenn
  597. mehrere eigene Module importiert werden, lohnt es sich, das Make intensiver
  598. zu nutzen. Mehr dazu in Kapitel 2.7.
  599.  
  600. Noch ein Tip zum Starten von Programmen, deren Namen Sie zwar wissen
  601. aber  sie  nicht  erst  umständlich  suchen  wollen,  vielleicht  sogar  erst  noch
  602. übersetzen müssen. Wenn wir Ihnen hier erzählen, Sie sollen beispielsweise
  603. das  Programm  TEXTDEMO  starten,  können  Sie  davon  ausgehen,  daß  sich
  604. dessen Quelltext in dem Ordner DEMO oder UTILITY befindet. So können Sie
  605. nun eine Arbeitsdatei wählen (Taste N) und dort den Quelltextnamen (ohne den
  606. Ordnernamen) eingeben (Taste P). Dieser wird in der Regel aus den ersten
  607. acht Buchstaben des Modulnamens und  der  Endung  ".M"  bei  Hauptmodulen
  608. gebildet. Bei unserem Beispiel also TEXTDEMO.M. Nun drücken Sie einfach die
  609. Taste A oder machen einen Doppelklick aus das Ausführen-Symbol. Dann wird,
  610. falls das Modul noch nicht übersetzt wurde, der Compiler automatisch aktiviert,
  611. daraufhin wird das Programm gestartet.
  612. 2.1  Bedienung: Los geht's                                                2 - 14
  613. ________________________________________________________
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.                                Diese Seite ist leer
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.           Trifft dies nicht zu, gehen Sie bitte wie folgt vor:
  658.           Beschaffen Sie ein Blatt Papier (DIN A5). Prüfen Sie, ob das Blatt leer, d.h., frei von
  659.           Buchstaben, ist. Lochen Sie das Blatt mittig. Ein Bürolocher leistet hierbei gute Dienste.
  660.           Heften Sie das von Ihnen erzeugte Blatt auf diese Seite. Sie muß vollständig verdeckt
  661.           werden. Danke.
  662.           Versäumen Sie nicht, diesen Hinweis auf dieser Seite nachzutragen, damit die Betriebssicherheit
  663.           Ihres Handbuchs auch weiterhin gewährleistet bleibt.
  664. 2.2  Bedienung: Shell                                                     2 - 15
  665. ________________________________________________________
  666.  
  667.  
  668. 2.2    Shell
  669.  
  670. Über die Modula-Shell steuern Sie die einzelnen  Komponenten  des  Modula-
  671. Systems: Editor, Compiler, Linker... Die Shell unterstützt Sie dabei nicht nur
  672. durch die GEM-Benutzeroberfläche, sondern erledigt vieles auch automatisch
  673. für Sie - etwa den Aufruf des Editors nach Übersetzungsfehlern oder das
  674. "heimliche" Linken (Binden) eines Moduls vor der Ausführung.
  675.  
  676.  
  677. Aufruf der Shell
  678.  
  679. Wir gehen davon aus, daß Sie sich eine Arbeitsdiskette zusammengestellt ha~
  680. ben  (siehe  Kapitel  2.1).  Wenn  Sie  alle  dort  beschriebenen  Vorbereitungen
  681. getroffen haben, klicken Sie die Modula-Shell MM2SHELL.PRG doppelt an. Das
  682. Laden der Shell kann - je nach Konfiguration - eine Weile dauern, falls weitere
  683. Module resident geladen werden (siehe 2.1). Wenn die Shell betriebsbereit ist,
  684. meldet sie sich mit einer Menüzeile und einem neuen Desktop. Es ist zu beach~
  685. ten,  daß  sich  im  Verzeichnis  der  Shell  zumindest  immer  die  Dateien
  686. MM2SHELL.RSC und MM2SHELL.M2P befinden.
  687.  
  688.  
  689. Das Shell-Desktop
  690.  
  691. Das  Monitor~
  692. bild,  das  die
  693. Shell     Ihnen
  694. zeigt, erinnert
  695. Sie      wahr~
  696. scheinlich  ein
  697. wenig  an  das
  698. GEM-Desktop:
  699. Am     oberen
  700. Rand des Bild~
  701. schirms   gibt
  702. es eine Menü~
  703. zeile; darunter
  704. eine  Arbeits~
  705. fläche, auf der  allerlei  Geräte  'herumstehen'.  Verschaffen  wir  uns  erstmal
  706. einen Überblick über das Inventar:
  707.  
  708. Die Diskettensymbole erfüllen eine Funktion, die Sie schon vom
  709. GEM kennen - sie repräsentieren die Massenspeicher, also Dis~
  710. ketten, Festplatte oder RAM-Disk. Wenn Sie einen Kasten dop~
  711. pelt anklicken, wird das Inhaltsverzeichnis in einem Fenster angezeigt. Die Na~
  712. men der Symbole werden übrigens von denen des GEM-Desktops übernommen.
  713. 2.2  Bedienung: Shell                                                     2 - 16
  714. ________________________________________________________
  715.  
  716.  
  717.  
  718. Ebenso  vertraut  sollte  Ihnen  der  Abfalleimer  sein.  Wie  beim
  719. GEM-Desktop kann auch hier alles Mögliche hineingeworfen wer~
  720. den.
  721.  
  722. Einige Unterschiede zum Desktop gibt es aber doch. Die Inhaltsverzeichnisse
  723. können nur als Text dargestellt werden und nicht auch als Symbole (Icons).
  724. Auch eine Sortierung nach Datum, Größe oder Extension ist z. Zt. nicht mög~
  725. lich (aber wenn Sie wollen, können Sie das selbst ändern - doch dazu mehr im
  726. Kapitel Fünf). Einzelne Dateien lassen sich wie gewohnt selektieren (einfach
  727. anklicken) oder als Objekte auf andere schieben. Die Erweiterung der Selektion
  728. geschieht, wie üblich, durch Festhalten der Shift-Taste beim Anklicken. Auf
  729. dem GEM-Desktop ist es außerdem möglich, mehrere Dateien auf einmal zu
  730. selektieren,  indem  neben  die  Datei-Symbole  bzw.  -Namen  gezeigt  und  mit
  731. festgehaltener Maustaste ein Gummiband um die gewünschten Dateien gezogen
  732. wird. In der Modula-Shell kann nicht neben die Namen geklickt werden - statt
  733. dessen wird diese Multi-Selektion durch Festhalten der Control-Taste erreicht.
  734.  
  735. Wird eine einzelne Datei selektiert, erscheint ihr Name
  736. übrigens auch in der Anzeigebox für die aktuelle Datei.
  737. Je nachdem, ob es eine ausführbare Datei ist (Program~
  738. me, Module, Make-, Batch- und Parameter-Dateien) oder nicht, wird sie als
  739. CODE oder TEXT eingetragen. Die aktuelle Datei spielt bei der Aktivierung der
  740. Shell-Funktionen über Tastaturkommandos eine Rolle. Sie kann auch manuell
  741. bestimmt werden durch Control-P oder einen Doppelklick auf das Anzeigefeld.
  742.  
  743. Teilweise wird die aktuelle  Datei  auch  durch  andere  Shell-Operationen  neu
  744. definiert. Beispielsweise wird nach der Compilierung eines Moduls der erzeugte
  745. Code zur aktuellen Code-Datei, so daß sich dann, ohne langes Suchen in den
  746. Disk-Verzeichnissen nach der Datei, das Modul bequem durch Control-A oder
  747. einen Doppelklick auf das Ausführen-Symbol bei gleichzeitigem Festhalten der
  748. rechten Maus-Taste starten läßt.
  749.  
  750. Hinter dem Resident-Symbol verbirgt sich der Zugriff auf  die
  751. residenten und geladenen Module in der Shell. Durch das Öffnen
  752. (Doppelklick) erhält man ein Fenster, das die z. Zt. geladenen
  753. Module und Programme zeigt - es sind Kopien der ausführbaren Code-Dateien,
  754. die von Disk geladen wurden, um schneller verfügbar zu sein. Genauso wie die
  755. Dateien  der  Disk-Inhaltsverzeichnisse  können  die  geladenen  Module  durch
  756. Ziehen in den Abfalleimer aus dem Speicher (der Shell) entfernt werden oder
  757. umgekehrt  Code-Dateien  aus  Disk-Fenstern  auf  das  Resident-Symbol  oder
  758. dessen Fenster gezogen werden, um sie neu zu laden. Das Resident-Fenster
  759. kann auch durch Drücken der Taste R geöffnet werden.
  760. 2.2  Bedienung: Shell                                                     2 - 17
  761. ________________________________________________________
  762.  
  763.  
  764. Durch  Festhalten  der  Alternate-Taste  beim  Öffnen  des  Resident-Fensters
  765. werden - statt nur der dazugeladenen - alle Module, die zum dem Zeitpunkt
  766. geladen oder resident in der Shell eingelinkt sind, angezeigt - diese residenten
  767. Module können jedoch nicht entfernt werden (das erreichen Sie nur, indem Sie
  768. die Shell, in welche sie alle fest eingebunden sind, verlassen).
  769.  
  770. Auf das Linken gehen wir in Kapitel 2.6 intensiver ein - hier nur
  771. als Information, daß damit das Linker-Programm gestartet wird,
  772. welches ein Modul so vorbereitet, daß es danach auch außerhalb
  773. der Modula-Shell ausgeführt werden kann. Ein Doppelklick oder Druck auf die
  774. Taste L bewirkt das Linken der aktuellen Arbeitsdatei.
  775.  
  776. Bleibt noch das Scannen-Symbol, das zur Suche nach Laufzeit~
  777. fehlern dient. Näheres dazu in Kapitel 2.5. Um den Scanner für
  778. die Arbeitsdatei zu starten, kann ein Doppelklick darauf erfolgen
  779. oder die Taste S gedrückt werden.  Nach  einem  erfolgten  Laufzeitfehler  in
  780. einem Programm  kann  der  dabei  geführte  Fehler-Dialog  durch  zusätzliches
  781. Festhalten der Shift-Taste nochmal aktiviert werden.
  782.  
  783. Schließlich finden Sie auf dem Bildschirm die Symbole Editieren, Compilieren
  784. und Ausführen, deren Bedeutung Sie bereits im Kapitel "Ein erstes Programm"
  785. erfahren haben. Auch sie werden  durch ihre Anfangsbuchstaben E, C und A
  786. über die Tastatur oder durch Doppelklick aktiviert, um die betreffende Opera~
  787. tion mit der aktiven Arbeitsdatei auszulösen.
  788.  
  789. Die Arbeitsdateien sind ein bequemes Mittel, um abwech~
  790. selnd verschiedene Module zu bearbeiten. Es können bis
  791. zu  zehn  von  ihnen  in  der  Shell  angesprochen  werden.  Die  Arbeitsdateien
  792. werden in kleinen Feldern angezeigt, die durch Anklicken oder durch Drücken
  793. der zugehörigen Tastenziffer angewählt werden können.
  794.  
  795. Ist  eine  Arbeitsdatei  selektiert  (die  Ziffer  des  Feldes  ist  zur  Kontrolle
  796. invertiert),  kann  ein  bequemer  Doppelklick  auf  die  Symbole  Editieren,
  797. Compilieren, Ausführen, Linken oder Scannen, oder der Druck auf einen der
  798. entsprechenden Anfangsbuchstaben, die gewünschte  Operation  bezüglich  der
  799. Arbeitsdatei  auslösen.   Dieselben   Funktionen   können   durch   zusätzliches
  800. Festhalten der Control-Taste oder der rechten Maus-Taste statt dessen auf
  801. die aktuelle Datei angewandt werden.
  802.  
  803. Natürlich muß eine Datei nicht erst zur aktuellen oder Arbeitsdatei ernannt
  804. werden, um sie beispielsweise in den Editor zu laden. Wie beim Kopieren von
  805. Dateien können die Einträge aus den Fenstern auch direkt auf die Symbole
  806. gezogen werden.
  807.  
  808. Ein  Doppelklick  auf  Dateien  ist  auch  möglich:  Je  nach  Art  der  Datei
  809. - ausführbar oder nicht  -  wird  sie  gestartet  oder  in  den  Editor  geladen.
  810. Dateien ohne Extension werden dabei wie Code-Dateien behandelt.
  811. 2.2  Bedienung: Shell                                                     2 - 18
  812. ________________________________________________________
  813.  
  814.  
  815.  
  816. Zu  Beginn  sind  noch  keine  Arbeitsdatei-
  817. Felder auf dem Desktop vorhanden. Diese
  818. müssen erst durch Drücken der Taste N
  819. oder  Anwählen   des   Menüpunkts   neue
  820. Arbeitsdatei erzeugt werden. Entsprechend
  821. können  sie  mit  lösche  Arbeitsdatei  oder
  822. der Taste Delete wieder entfernt werden.
  823.  
  824. Ein Modul wird alsdann als Arbeitsdatei bestimmt, indem entweder eine Quell~
  825. textdatei auf ein solches Arbeitsfeld gezogen oder nach Drücken der Taste P
  826. ihr Name manuell eingegeben wird.
  827.  
  828. Die  restlichen  Funktionen  des  Datei-Menüs  entsprechen  denen  des  GEM-
  829. Desktops,  die  jeweils  rechts  aufgeführten  Tastencodes  dokumentieren  eine
  830. optionale Anwahl über die Tastatur.
  831.  
  832. Übrigens  können  alle  Objekte  einschließlich  der  Arbeitsdateifelder  auf  dem
  833. Shell-Desktop beliebig positioniert werden, beim Verlassen der Shell werden
  834. dann - auf Wunsch - alle Einstellungen gesichert.
  835.  
  836.  
  837. Ausführen von Programmen und anderen Dateien
  838.  
  839. Zum Ausführen einer Datei ziehen Sie beispielsweise den Eintrag aus dem Datei~
  840. verzeichnis auf das Ausführen-Symbol. Auf diese Weise können Sie sowohl
  841. übersetzte Module ausführen, die dann automatisch mit den benötigten Impor~
  842. ten gebunden werden, als auch komplett gebundene (gelinkte) Programme. Eine
  843. andere Möglichkeit, Dateien zu starten, besteht darin, einen Doppelklick auf
  844. den Eintrag im Fenster durchzuführen.
  845.  
  846. Es ist auch möglich, Quelltextdateien zum Ausführen zu bringen - in diesem
  847. Fall wird erst nach dem vermutlichen Code-Dateinamen gesucht (dieser wird
  848. aus  dem  Quelltext-Namen  und  den  möglichen  Endungen  der  Code-Module
  849. gebildet); wird er gefunden und ist das Datum der Code-Datei jünger als das
  850. der Quelltextdatei, wird die Code-Datei sofort ausgeführt, ansonsten wird vor~
  851. her der Quelltext automatisch übersetzt. Dies funktioniert auch bei der aktiven
  852. Arbeitsdatei (die ja immer ein Quelltext sein muß), indem ein Doppelklick auf
  853. das Ausführen-Symbol getätigt oder die Taste A gedrückt wird. Voraussetzung
  854. für die Funktionalität dieses Mechanismus ist eine allzeit korrekt eingestellte
  855. Systemzeit im Computer. Wie dies erreicht wird, erfahren Sie im Kapitel 2.7
  856. bei der Anwendung des Make.
  857. 2.2  Bedienung: Shell                                                     2 - 19
  858. ________________________________________________________
  859.  
  860.  
  861. Neben echten Code-Dateien und deren Quelltexten können außerdem Make-,
  862. Batch- und Parameter-Dateien "ausgeführt" werden:
  863.  
  864. * Wird eine Make-Datei (Endung M2M) ausgeführt, startet die Shell das Make-
  865.   Programm, welches dann prüft, ob Module, die in der Make-Datei aufge~
  866.   führt sind, neu übersetzt werden müssen (siehe Kapitel 2.7). Ist dies der
  867.   Fall, startet die Shell daraufhin den Compiler,  der  dann  alle  notwendigen
  868.   Module übersetzt - es sei denn, es tritt ein Fehler  auf:  Dann  wird  der
  869.   Vorgang abgebrochen, der Fehler im Editor angezeigt, und der Make-Vorgang
  870.   muß nach der Korrektur wiederholt werden.
  871.  
  872. * Eine Batch-Datei (Endung M2B) enthält eine Reihe von Anweisungen, die mit
  873.   einem Texteditor erstellt werden können. Mit ihr können die Suchpfade für
  874.   Compiler, Editor und Programme sowie die Einträge des Tool-Menüs bestimmt
  875.   und andere Programme  (auch  Compiler,  Linker,  Make)  gestartet  werden.
  876.   Näheres weiter unten.
  877.  
  878. * Eine Parameter- oder Projekt-Datei hat die Endung M2P und enthält die Ein~
  879.   stellungen der Shell, wie Arbeitsdateien,  Fensterpositionen,  Parameter  für
  880.   Editor, Shell, Compiler usw. Diese Dateien werden von der Shell durch das
  881.   Sichern  der  Einstellungen  erzeugt.  Wird  eine  solche  Datei  "ausgeführt",
  882.   werden alle darin enthaltenen Einstellungen von der Shell übernommen.
  883.  
  884. Diese Art des Ausführens von Quelltexten, Make-, Batch- und Parameterdateien
  885. ist  auch  bei  den  im  Tools-Menü  eingetragenen  Funktionen  möglich:  Wird
  886. beispielsweise  eine  Datei  DEMO.M2M  als  Tool  eingetragen,  wird  bei  ihrer
  887. Aktivierung über das Tools-Menü der Make-Vorgang eingeleitet, so, als wenn
  888. die Datei auf das Ausführen-Symbol gezogen oder doppelt angeklickt worden
  889. wäre.
  890.  
  891.  
  892. Ausführen speziell von Code-Dateien
  893.  
  894. Vom GEM-Desktop her ist Ihnen bekannt, daß Dateien mit den Endungen APP,
  895. PRG, TOS und TTP ausführbar sind. Diese Programme sind mit anderen Ent~
  896. wicklungssystemen (natürlich auch mit Megamax Modula-2) erstellt worden und
  897. haben alle ein einheitliches Dateiformat, das vom Betriebssystem (GEMDOS)
  898. verstanden wird, und somit können sie vom Desktop oder auch von anderen
  899. Benutzeroberflächen (Shells) aus bequem gestartet werden. Diese Programme
  900. haben alle erforderlichen Routinen fest eingebunden und definieren beispiels~
  901. weise auch ihren eigenen Stack-Bereich.
  902.  
  903. Vom  Modula-Compiler  übersetzte  Module  sind  dagegen  noch  nicht  gelinkt
  904. (gebunden), so daß sie auch nicht ohne weiteres vom GEM-Desktop oder einer
  905. anderen Shell gestartet werden können, weil sie in der Regel dieses fremde
  906. Format nicht kennen. Deshalb verdienen diese Code-Module  auch  keine  der
  907. bekannten  Programm-Endungen.  Ausführbar  sind  die  übersetzten  Module
  908. 2.2  Bedienung: Shell                                                     2 - 20
  909. ________________________________________________________
  910.  
  911.  
  912. (natürlich nur die Haupt- und Implementations-, jedoch nicht die Definitionsmo~
  913. dule) unter der Shell aber trotzdem, dank des sogenannten Loaders, welcher
  914. ein in der Shell eingebundenes Modul darstellt, das eine dynamische Bindung
  915. der benötigten Module und andere Vorbereitungen, beispielsweise das Anlegen
  916. eines Stacks, automatisch durchführt.
  917.  
  918. Die übersetzen Code-Module können, entsprechend den gelinkten Programmen,
  919. die Endungen MOD (analog zu APP und PRG), MOS (TOS) oder MTP (TTP)
  920. tragen.  Wird  also  eine  Datei  mit  einer  dieser  Endungen  unter  der  Shell
  921. ausgeführt, wird sie wie die gelinkten Programme unter dem  GEM-Desktop
  922. behandelt: Bei MOS-Dateien wird der TOS-Modus (weißer Hintergrund, Maus
  923. aus, Blinke-Cursor an) aktiviert, bei MTP-Dateien wird zusätzlich nach einer
  924. Kommandozeile  (Argumentzeile)   für   das   Programm   gefragt.   Wird   ein
  925. Code-Modul an den Linker zum Binden übergeben, erzeugt dieser passend zur
  926. Endung  den  entsprechenden  Programmnamen  (Bsp:  "TEST.MOS"  wird  zu
  927. "TEST.TOS").
  928.  
  929. Falls Ihnen übrigens andere Endungen besser vertraut sind (OBJ, OBM, SYM,
  930. usw.),  können  Sie  in  Kapitel  Fünf  nachlesen,  wie  einfach  Sie  dies  dem
  931. Megamax-System beibringen können.
  932.  
  933. Der Linker kennt noch eine weitere Endung: Aus MAC  erzeugt  er  gelinkte
  934. Dateien der Endung ACC; dies ist vorteilhaft, wenn Sie Accessories erzeugen
  935. wollen - diese dürfen in der Regel nicht ausgeführt, sondern nur als ACC-
  936. Dateien beim Booten des Rechners vom GEM aktiviert werden (es sei denn,
  937. Sie verwenden die Funktion PrgCtrl.Accessory() zur Abfrage, ob das Programm
  938. als normale Anwendung oder als Accessory gestartet wurde).
  939.  
  940. Durch das Festhalten der Shift-Taste beim Starten erhalten Sie die Möglichkeit
  941. zur Eingabe einer Argumentzeile (Command Line) auch bei Programmen der
  942. Endungen MOD, MOS, APP, PRG und TOS.
  943.  
  944. Ein Problem, das noch nicht ganz zufriedenstellend gelöst wurde, ist die Wahl
  945. des aktuellen Verzeichnisses für zu startende Programme. So gibt es Pro~
  946. gramme, die als Hilfsprogramme der Shell dienen und  die  oft  gerne  stan~
  947. dardmäßig auf den in der Shell aktuellen Pfad (der durch das oberste offene
  948. Disk-Fenster  bestimmt  wird)  zugreifen  wollen,  beispielweise,  wenn  sie  den
  949. GEM-Datei-Selektor anzeigen. Andererseits gibt es Anwendungen, die weitere,
  950. dazu gehörende Dateien nachladen wollen, wie zum Beispiel GEM-Resource-
  951. Dateien (Endung RSC). Damit sie diese Dateien finden, ist es in der Regel so
  952. zu lösen, daß sie im Verzeichnis gesucht werden, in dem auch das Programm
  953. selbst steht. Davon macht beispielsweise auch die Modula-Shell Gebrauch: Sie
  954. sucht bei ihrem Start die Dateien MM2SHELL.RSC und MM2SHELL.M2P im zu
  955. dem Zeitpunkt aktuellen Verzeichnis,  welches  normalerweise  auch  dasjenige
  956. ist, in welchem die Shell selbst steht, weil ja auch im GEM-Desktop das ent~
  957. sprechende Fenster obenauf offen liegen muß, damit die Shell gestartet werden
  958. kann.
  959. 2.2  Bedienung: Shell                                                     2 - 21
  960. ________________________________________________________
  961.  
  962.  
  963. Nun gibt es aber auch beim GEM-Desktop die Möglichkeit, Programme nicht
  964. aus dem vordersten, aktiven Fenster zu starten: Zielt man beim Starten auf
  965. ein Programm in einem inaktiven Fenster und hält dabei die rechte Maus-Taste
  966. fest, wird das Programm gestartet, während das vordere Fenster den aktuellen
  967. Pfad  bestimmt.  Dies  machte  sogar  den  Entwicklern  des  TOS  bei  ATARI
  968. Schwierigkeiten, denn je nach Version des TOS gibt es verschiedene Resultate:
  969. Einmal wird das Programm überhaupt nicht gestartet, ein anderes Mal kann es
  970. seine RSC-Datei nicht finden.
  971.  
  972. Die Megamax-Shell geht nun so vor: Wird das Programm von einem Fenster
  973. gestartet,  wird  immer  der  Pfad  zum  aktuellen,  von  dem  das  Programm
  974. stammt. Ebenso wird verfahren, wenn eine Arbeitsdatei gestartet wird. Wird
  975. die  aktuelle  Datei  aufgerufen,  hängt  der  aktuelle  Pfad  vom  eingegebenen
  976. Dateinamen  ab:  Ist  ein  Pfadname  im  Dateinamen  enthalten,  wird  dieser
  977. aktiviert. Ist kein Pfadname enthalten, wird wiederum derjenige verwendet, von
  978. dem das Programm gestartet wird (das funktioniert, weil die Programme dann
  979. in den Ordnern gesucht werden können). Dies macht bei der aktuellen Datei
  980. nur dann einen Unterschied, wenn ihr Name manuell eingegeben wurde (durch
  981. Doppelklick  auf  dessen  Feld  oder  mittels  Control-P);  beim  Benennen  der
  982. aktuellen Code-Datei durch Anklicken im Fenster oder nach einem Make- oder
  983. Übersetzungsvorgang wird immer der vollständige Pfadname mit übernommen.
  984.  
  985. Wollen Sie also ein bestimmtes Programm starten, das Sie nicht erst in den
  986. Ordnern suchen wollen, brauchen Sie nur die aktuelle Datei zu  bestimmen,
  987. indem Sie den Namen des Programms (mit Endung, aber ohne Pfad) eingeben
  988. (Control-P) und dann starten (Control-A). Wollen Sie gar erreichen, daß ein
  989. Programm  einen  bestimmten  aktuellen  Pfad  erhält,  kann  dieser  bei  der
  990. Bestimmung der aktuellen Datei als Pfad mit eingegeben werden. Dann wird
  991. dieser Pfad zum aktuellen, das Programm wird jedoch, wenn es dort nicht
  992. vorhanden  ist,  weiterhin  in  den  anderen  Ordnern  gesucht  und  von  dort
  993. gestartet.
  994.  
  995. Bei den Systemprogrammen (Compiler, Linker, Make, Editor) und den unter
  996. dem Tools-Menü eingetragenen Programmen verhält es sich noch etwas anders.
  997. Da die Systemprogramme als feste Bestandteile des Entwicklungssystems mit
  998. der Shell  in  besonderer  Weise  kommunizieren  bzw.  die  Tools  oft  ähnliche
  999. Funktionen erfüllen,  kann  ihnen  der  aktuelle  Pfad  praktisch  egal  sein.  Aus
  1000. diesem Grund wird bei ihren Aufrufen normalerweise kein neuer aktueller Pfad
  1001. eingestellt, statt dessen bleibt der Pfad der Shell (oberstes Fenster) aktiv.
  1002. Damit nun aber auch andere Editoren oder Tools ihre benötigten Dateien (z. B.
  1003. RSC) nachladen können, gibt es auch hier die Möglichkeit, ihren aktuellen Pfad
  1004. zu definieren: Ist ein Systemprogramm oder ein Tool mit einem Pfadnamen
  1005. eingetragen, wird dieser Pfad beim Start aktiviert, ansonsten wird der Pfad
  1006. der Shell beibehalten.
  1007. 2.2  Bedienung: Shell                                                     2 - 22
  1008. ________________________________________________________
  1009.  
  1010.  
  1011. Um allgemein das Wechseln des Aktuellen Pfades beim Start eines Programms
  1012. zu verhindern, muß die Alternate-Taste bei Aktivierung der Ausführen-Funktion
  1013. festgehalten werden.
  1014.  
  1015.  
  1016. Programmaufruf und -abbruch bei gelinkten Programmen
  1017.  
  1018. Wird   ein   gelinktes   Programm   ausgeführt,   geschieht   dies,   wie   vom
  1019. GEM-Desktop her gewohnt: Das Programm wird in den Speicher geladen, falls
  1020. dies nicht schon vorher geschehen ist (siehe Laden von Code-Dateien), dann
  1021. wird  dessen  BSS-Bereich  (Speicher  für  die  globalen  Variablen)  gelöscht,
  1022. zuletzt  wird  es  gestartet.  Endet  das  Programm,  wird  zur  Megamax-Shell
  1023. zurückgekehrt.
  1024.  
  1025. Tritt ein fataler Fehler im aufgerufenen, gelinkten Programm auf, so daß eine
  1026. 68000-Exception (Bus-Fehler, Adreß-Fehler und weitere von dem Programm
  1027. nicht abgefangene Fehler) ausgelöst wird, erscheint statt der vom Desktop-
  1028. Start gewohnten Bömbchen die Scanner-Box (siehe Kapitel 2.5), in der aber
  1029. dann  keine  Lokalisation  der  Fehlerstelle  über  Back  und  Frwd  möglich  ist.
  1030. Wählen Sie dann Quit, finden Sie sich in der Shell wieder. Dann kann es aber
  1031. sein, daß die Maus nicht  mehr  sichtbar  ist  oder  andere  unsinnige  Effekte
  1032. eintreten. Wenn die Shell noch auf Eingaben reagiert, verlassen Sie die Shell,
  1033. z. B. mit Control-Q. Oft stellt dann  das  GEM-Desktop  den  Normalzustand
  1034. wieder her, so daß Sie die Megamax-Shell erneut starten können. Bei solchen
  1035. Abstürzen von Progammen ist es aber in der Regel immer das Sicherste, so
  1036. bald wie möglich einen Neustart des Rechners, beispielsweise durch Drücken
  1037. des RESET-Tasters, zu veranlassen, weil es möglich ist, daß das fehlerhafte
  1038. Programm auch Speicherbereiche, die dem TOS oder der Shell reserviert sind,
  1039. unkontrollierbar  überschrieben  hat,  was  sich  teilweise  erst  sehr  spät
  1040. bemerkbar macht.
  1041.  
  1042.  
  1043. Das Binden der Module
  1044.  
  1045. Wird ein vom Compiler übersetztes Modul gestartet, müssen zuerst die von
  1046. ihm importierten Module dazugebunden (gelinkt) werden.  Dies  wird  von  der
  1047. Prozedur CallModule des Loader-Moduls, die die Shell zum Starten sowohl von
  1048. gelinkten Programmen als auch von ungelinkten Modulen aufruft, automatisch
  1049. erledigt: Jedes benötigte Modul wird in den Speicher geladen, wird ein Modul
  1050. von  mehreren  anderen  importiert,  wird  es  selbstverständlich  nur  einmal
  1051. geladen.  Danach  werden  die  Module  gebunden,  das  heißt,  die  Referenzen
  1052. zwischen den Modulen (dies sind die importierten Prozeduren und Variablen)
  1053. werden fest verkettet. Diesen Vorgang nennt man Load-Time-Linking, weil das
  1054. Binden (Linken) der einzelnen Objekt-Module bei jedem Laden in den Speicher
  1055. von neuem erfolgt. Dem gegenüber steht das einmalige Linken im voraus, bei
  1056. dem das Ergebnis als eine Datei (gelinktes Programm) erzeugt wird.
  1057. 2.2  Bedienung: Shell                                                     2 - 23
  1058. ________________________________________________________
  1059.  
  1060.  
  1061. Auf den ersten Blick nun erscheint es ineffektiv, bei jedem Start das Linken
  1062. durchzuführen,  anstatt  dies  einmal  zu  tun:  Wird  das  Programm  mehrmals
  1063. nacheinander ohne Änderungen gestartet, vergeht viel mehr Zeit  durch  das
  1064. wiederholte  Laden  der  einzelnen  Code-Module  statt  der  einen  gelinkten
  1065. Programmdatei. Dies trifft aber nur bedingt zu. Ein Vorteil im dynamischen
  1066. (Load-Time-) Linken liegt darin, daß die Fehlerbehandlung (Debugging) einfacher
  1067. zu  gestalten  ist,  zweitens  können  so  mehrere,  abwechselnd  gestartete
  1068. Progamme  leichter  Informationen  untereinander  austauschen,  und  zu  guter
  1069. Letzt ist es oft auch zeitsparender. Das kommt daher:
  1070.  
  1071. Der Loader (bzw. dessen Funktion CallModule) lädt jedes benötigte Modul nur
  1072. einmal, auch wenn es von mehreren Modulen importiert wird. Dies ist sinnvoll
  1073. und  findet  bei  auch  jedem  normalen  Linker  anderer  Entwicklungssysteme
  1074. Verwendung.
  1075.  
  1076. Die Megamax-Shell besteht nun wiederum selbst aus vom Megamax-Compiler
  1077. übersetzten Modulen, die lediglich durch den Linker in eine Datei zusammengefügt
  1078. wurden. Nun bietet es sich an, diese schon im Speicher befindlichen Module bei
  1079. Bedarf  mitzubenutzen,  genauso  wie  dies  mit  den  nachgeladenen  Modulen
  1080. geschieht. Bedingung ist lediglich, daß das Loader-Modul, das selbst ja auch
  1081. Bestandteil  der  Shell  ist,  ausreichend  Informationen  über  die  in  der  Shell
  1082. befindlichen Module erhält. Dies wurde beim Linken der Shell durch eine beson~
  1083. dere Einstellung (Linken ohne Optimierung) erreicht.
  1084.  
  1085. Wird also der Loader aufgerufen, ein Modul zu starten (z. B. durch Ansprechen
  1086. der Ausführen-Funktion der Shell), geht er wie bereits oben beschrieben vor:
  1087. Zuerst wird nachgesehen, ob sich das geforderte Modul schon im Speicher
  1088. befindet. Normalerweise ist dies beim Hauptmodul noch nicht der Fall,  also
  1089. wird es nachgeladen und der Loader merkt sich, daß dieses Modul nun geladen
  1090. ist. Dann wird nachgesehen, welche Module importiert werden. Bei denen wird
  1091. genauso verfahren: Ist das Modul noch nicht im Speicher, wird es geladen und
  1092. dessen Importe ebenfalls berücksichtigt.
  1093.  
  1094. Ist ein Modul schon im Speicher, wird es nicht weiter verfolgt - in diesem Fall
  1095. kann  davon  ausgegangen  werden,  daß  alle  seine  Importe  ebenfalls  schon
  1096. geladen sind. Es ist also nicht möglich, auch nicht mit den Lade-/Entlade-
  1097. Funktionen des Loader-Moduls bzw. der Shell,  daß  am  Ende  ein  Modul  im
  1098. Speicher verbleibt, dessen Importe nicht ebenfalls alle geladen sind!
  1099.  
  1100. Nach diesen Lade-Regeln nun werden die  in  der  Shell  vorhandenen  Module
  1101. immer als bereits geladen (speziell: resident) behandelt. Daraus folgt, daß ein
  1102. Modul, das nur Module importiert, die schon in der Shell befindlich eingebunden
  1103. sind, praktisch keine Ladezeit mehr hat, weil lediglich das Hauptmodul selbst
  1104. von Disk geladen werden muß - das Binden dieses Moduls mit denen der Shell
  1105. geht so schnell, daß Sie davon nichts merken.
  1106. 2.2  Bedienung: Shell                                                     2 - 24
  1107. ________________________________________________________
  1108.  
  1109.  
  1110. Nach der Bindung aller Module werden zuerst, wie bei gelinkten Programmen,
  1111. alle globalen Variablen gelöscht (Pointer auf NIL, REALs auf 0.0) und dann alle
  1112. Modulkörper aufgerufen, das am tiefsten liegende von den anderen importierte
  1113. Modul  wird  zuerst,  das  oberste,  von  der  Shell  ausgewählte  Modul  zuletzt
  1114. initialisiert. Bei zirkularen Importen (A importiert B, B wiederum A) ist die
  1115. Reihenfolge undefiniert und kann jederzeit wechseln.
  1116.  
  1117. Wollen Sie die Möglichkeit nutzen, daß mehrere durch CallModule gestartete
  1118. Anwendungen (Module) Daten über gemeinsam importierte Module austauschen
  1119. (shared  data),  müssen  Sie  verhindern,  daß  diese  gemeinsamen  Module
  1120. jedesmal neu  initialisiert  werden  und  neuen  Speicherplatz  für  ihre  globalen
  1121. Variablen  erhalten.  Das  erreichen  Sie,  indem  Sie  solche  Module  mit  einer
  1122. besonderen Compiler-Direktive ($Y+, siehe Kapitel 3.4) übersetzen.
  1123.  
  1124. Während der gesamten Initialisierungsphase und beim Start des Hauptmoduls
  1125. wird ein Stack verwendet, dessen Größe in Info/Umgebung unter Stackgröße...
  1126. (für Load-Time-Linking) einstellbar ist. Tritt während des Programmlaufs ein
  1127. Stack-Überlauf-Fehler auf, kann der Stack also ohne Neuübersetzung für den
  1128. nächsten Start verändert werden.  Die  Systemprogramme  (Compiler,  Linker,
  1129. Make sowie die Editoren GME und GEP ED) verwenden übrigens eine eigene,
  1130.                                           _
  1131. fest in der Shell definierte Stackgröße.
  1132. 2.2  Bedienung: Shell                                                     2 - 25
  1133. ________________________________________________________
  1134.  
  1135.  
  1136. Resident-Laden von Code-Dateien
  1137.  
  1138. Wenn ein gestartetes Modul abgelaufen ist, wird es wieder aus dem Speicher
  1139. entfernt. Auch die von ihm importierten Module, die noch von der Diskette
  1140. nachgeladen wurden, bleiben natürlich nicht im Speicher - bei einem  neuen
  1141. Start des Moduls wird alles erneut geladen. Um bei häufiger Benutzung eines
  1142. Moduls diese Ladezeiten zu eliminieren, können Sie Module in den Speicher
  1143. laden.   Dazu   dient   das   Resident-Symbol   auf   der   Arbeitsfläche.   Das
  1144. Resident-Symbol  funktioniert  ganz  ähnlich  wie  die  Diskettensymbole.  Sie
  1145. können...
  1146.  
  1147. * einen Dateieintrag auf das Ladesymbol schieben, um das Modul
  1148. in den Speicher zu laden (Control-R lädt die aktuelle Datei). Es
  1149. ist auch möglich, gelinkte Programme auf diese Weise zu laden;
  1150.  
  1151. * das Ladesymbol doppelt anklicken, um ein Fenster mit dem Verzeichnis der
  1152. geladenen Module zu öffnen;
  1153.  
  1154. * Einträge aus diesem Fenster mit der Maus auf das Ausführen-Symbol schie~
  1155. ben oder doppelt anklicken, um sie auszuführen. Allerdings ist es auch möglich,
  1156. ein Modul aus einem ganz normalen Dateifenster zur Ausführung zu bringen -
  1157. die Shell (der Loader) überprüft, ob das Modul schon geladen ist, und führt
  1158. ggf. die geladene Version aus.
  1159.  
  1160. * Außerdem ist es möglich, Einträge aus dem Verzeichnis der geladenen Mo~
  1161. dule in den Abfalleimer zu schieben, um sie wieder aus dem RAM zu löschen.
  1162. Beachten Sie aber, daß das Ladesymbol keine normale RAM-Disk darstellt -
  1163. beim Laden werden die Module bereits für die Ausführung vorbereitet (gelinkt);
  1164. daher ist es nicht möglich, ein geladenes Modul auf ein Diskettensymbol zu
  1165. schieben oder an den Linker zu übergeben!
  1166.  
  1167. Ein anderer Weg, Module und gelinkte Programme resident laden zu lassen, ist
  1168. das Eintragen eines LOAD-Kommandos in eine Batch-Datei (s. Abschnitt weiter
  1169. unten in diesem Kapitel). Dies ist eine bequeme Möglichkeit, regelmäßig benötigte
  1170. Module resident in den Speicher zu laden, solange man sich in der Modula-
  1171. Shell befindet.
  1172.  
  1173. Die  so  geladenen  Module  werden  zwar  in  die  schon  residenten  Module
  1174. eingebunden (gelinkt), jedoch nicht intitialisiert! Die Initialisierung mit  Aufruf
  1175. der Modulkörper wird weiterhin so vorgenommen, wie unter Binden der Module
  1176. beschrieben, also als wenn sie jedesmal bei Bedarf doch  von  Disk  geladen
  1177. werden würden.
  1178.  
  1179. Zum Schluß noch ein Tip: Während der Programmentwicklung können Sie den
  1180. Entwicklungszyklus (Edieren -  Übersetzen  -  Testen)  deutlich  beschleunigen,
  1181. falls Ihr Programm Module importiert, die nicht bereits in der Shell vorhanden
  1182. 2.2  Bedienung: Shell                                                     2 - 26
  1183. ________________________________________________________
  1184.  
  1185.  
  1186. sind (das merken Sie an den Diskettenzugriffen vor jedem Programmstart):
  1187. Dann sollten Sie die importierten Module laden. Das Programm, an dem Sie
  1188. gerade arbeiten, sollte dagegen nicht geladen sein - die geladene Version hat,
  1189. wie oben gesagt, immer Vorrang vor  dem  neu  übersetzten  Modul  auf  der
  1190. Diskette.
  1191.  
  1192. Das Laden ist meist dem Ablegen eines Moduls in der RAM-Disk vorzuziehen:
  1193. Ein Modul aus der RAM-Disk wird zur Ausführung jeweils ein zweites Mal in
  1194. den RAM kopiert und belegt dann doppelten Platz. Allerdings wird beim Laden
  1195. bereits Platz für die globalen Variablen reserviert, der belegt bleibt, solange
  1196. das Modul im RAM verbleibt. Dies wiederum macht sich bei wenigen Program~
  1197. men deutlich bemerkbar (beispielsweise bei dem Programmeditor TEMPUS von
  1198. CCD).
  1199.  
  1200.  
  1201. Laden gelinkter Programme
  1202.  
  1203. Das Laden von gelinkten Programmen wird prinzipiell durch eine Sonderfunktion
  1204. des  GEMDOS  ermöglicht.  Aufgrund  einer  konzeptionellen  Schwäche  bei
  1205. besagter Funktion ist aber deren Anwendung leider nicht so "idiotensicher" wie
  1206. die des Ladens von Megamax-Modulen.
  1207.  
  1208. Das Problem ergibt sich bei der Reservierung des Stacks für die Programme:
  1209. Ein gelinktes Programm, das normal gestartet wird, wird an den Beginn des
  1210. größten freien Speicherbereichs geladen. Wird es dann aufgerufen, erhält es
  1211. erstmal den gesamten freien Speicher hinter dem Programmcode für sich als
  1212. reservierten Speicher. Daraufhin berechnet es den für sich selbst benötigten
  1213. Speicher und gibt den Rest wieder frei. Der selbst benötigte Speicher besteht
  1214. in der Regel aus dem Platz für die globalen Variablen und dem Stack des
  1215. Programms.
  1216.  
  1217. Wird ein solches Programm nur geladen, muß der Loader, der dies organisiert,
  1218. dafür sorgen, daß nur so viel Platz für das Programm reserviert bleibt, wie es
  1219. später beim Start benötigen wird, damit der Rest des Speichers frei bleibt für
  1220. weitere Anwendungen. Aufgrund der Konventionen aber  muß  das  Programm
  1221. erwarten können, daß es den benötigten Speicher für die Variablen und den
  1222. Stack  direkt  hinter  dem  Programmcode  vorfindet  (für  die  Experten:  Die
  1223. Relozierung, die das GEMDOS beim Laden vornimmt, nimmt auch sofort die
  1224. Adreßbestimmung der globalen Variablen im BSS-Segment - welches in der
  1225. Regel direkt hinter dem Programmcode oder dem DATA-Segment liegt - vor,
  1226. so daß dieser Bereich später nicht mehr an eine andere Stelle verschoben
  1227. werden kann). Hier liegt das Problem:  Es  ist  zwar  allgemein  möglich,  den
  1228. benötigten Platz für die globalen Variablen zu ermitteln, die Stack-Größe aber
  1229. kann  nicht  vorausgesehen  werden.  So  muß  also  beim  Laden  abgeschätzt
  1230. werden, wieviel Platz der Stack später benötigen wird. Zuviel Platz kann dem
  1231. Programm nicht schaden, nur wird der Platz ja schon beim Laden reserviert,
  1232. so daß der verbleibende freie Speicher ggf. unnötig eingeschränkt wird.
  1233. 2.2  Bedienung: Shell                                                     2 - 27
  1234. ________________________________________________________
  1235.  
  1236.  
  1237. Ist der Stack zu klein gewählt, ist es möglich (aber nicht sicher), daß das
  1238. geladene  Programm  während  seines  Aufrufs  fehlerhaft  arbeitet  oder  gar
  1239. abstürzt (Programm reagiert nicht mehr auf Eingaben, oder es erscheinen die
  1240. Bömbchen und das Programm kehrt in die Shell zurück).
  1241.  
  1242. Gegebenenfalls  muß  also  zuerst  ein  geladenes  Programm  mit  Vorsicht
  1243. angewendet werden (jedenfalls sollte es bei Unsicherheit nicht mit wichtigen
  1244. Originaldaten arbeiten, die es ja zerstören könnte).
  1245.  
  1246. Die meisten Fremdprogramme verwenden einen Stack von 8 bis 16 KByte (auch
  1247. Tempus kommt beispielsweise mit einem Stack von 8KB, =8192, zurecht). So
  1248. reicht  es  oft  aus,  zur  Sicherheit  den  Stack  beim  Laden  in  dieser  Größe
  1249. vorzusehen. Erst,  wenn  sich  ungewöhnliche  Effekte  bei  der  Benutzung  der
  1250. geladenen Programme zeigen, sollte der Stack jeweils vor dem erneuten Laden
  1251. durch Verdoppelung erhöht werden.
  1252.  
  1253. Die Bestimmung des Stacks  beim  Laden  von  gelinkten  Programmen  erfolgt
  1254. durch den Wert, den auch der Loader beim Start von Modulen verwendet. Er
  1255. kann in den Umgebungsinformationen unter Stack-Größe für Load-Time-Linking
  1256. bestimmt oder durch die Anweisung STACKSIZE in Batch-Dateien, am besten
  1257. direkt vor dem Laden des Programms mit LOAD, auf einen besonderen Wert
  1258. gesetzt werden.
  1259. 2.2  Bedienung: Shell                                                     2 - 28
  1260. ________________________________________________________
  1261.  
  1262.  
  1263. Die Menüzeile der Shell
  1264.  
  1265. Die  Menüzeile  am  oberen  Bildschirmrand  bietet  die  Menüpunkte  MM2Shell,
  1266. Datei, Parameter, Info und ggf. Tools an. Unter MM2Shell erreichen Sie wie
  1267. üblich die Accessories sowie eine Meldung über die Version der Shell. Der
  1268. Menüpunkt Datei wurde schon weiter oben behandelt.
  1269.  
  1270. Unter Parameter finden sich:
  1271.  
  1272. Shell: Siehe unten.
  1273. Editor: Siehe Kapitel 2.3
  1274. Compiler: Siehe Kapitel 2.4
  1275. Linker: Siehe Kapitel 2.6
  1276. speichern: Sichert die Einstellungen aller Parameter, der Symbol- und Fenster~
  1277.   positionen  und  der  Umgebungseinstellungen,  jedoch  nicht  den  Status  der
  1278.   geladenen Module, der über die Menüzeile abrufbaren Tools und der Such~
  1279.   pfade  (diese  Einstellungen  sind  über  die  Batch-Dateien  bestimmbar).  Die
  1280.   Einstellungen  werden  in  der  Datei  gesichert,  die  zu  dem  Zeitpunkt  als
  1281.   Parameterdatei unter Parameter/Shell... eingestellt ist.
  1282.  
  1283. Die Raute bei den Tastenangaben im Parameter-Menü zeigt übrigens an, daß
  1284. diese Funktionen mit der Alternate-Taste in Verbindung mit dem Buchstaben zu
  1285. erreichen sind, während der Pfeil für die Control-Taste steht.
  1286.  
  1287.  
  1288. Unter Info finden sich:
  1289.  
  1290. Umgebung: Siehe unten.
  1291. Hilfe: Zeigt den Inhalt der Textdatei MM2SHELL.HLP an, falls sich diese im
  1292.   Verzeichnis der Shell befindet.
  1293.  
  1294.  
  1295. Unter Tools können Sie bis zu zehn eigene ausführbare
  1296. Dateien eintragen (mittels der Anweisung Tool in  einer
  1297. Batch-Datei). Diese erscheinen dann  unter  dem  Tools-
  1298. Menüpunkt und können auch über die Funktionstasten an~
  1299. gewählt werden.
  1300. 2.2  Bedienung: Shell                                                     2 - 29
  1301. ________________________________________________________
  1302.  
  1303.  
  1304. Die Shell-Parameter (Parameter/Shell...)
  1305.  
  1306. Erzeuge Fenster:
  1307. Wurzel öffnet  Fenster  bei
  1308. Doppelklick  in   gewohnter
  1309. Weise.  Der  aktuelle  Pfad
  1310. kann  statt  dessen   ent~
  1311. weder  durch  die  hiesige
  1312. Standardeinstellung    oder
  1313. durch Festhalten der Shift-
  1314. Taste   beim   Doppelklick
  1315. geöffnet werden.
  1316.  
  1317. Kopier- und Löschbestätigung bestimmen, ob bei den entsprechenden Dateiope~
  1318. rationen eine Bestätigung gefordert werden soll.
  1319.  
  1320. Abbruch mit Control-C: Ist diese Option aktiv, können von der Shell gestartete
  1321. Programme mit Control-C abgebrochen werden, während sie Ein- oder Ausga~
  1322. ben über die Module TextWindows oder InOut durchführen. Auch ist es dann
  1323. möglich, mit Control-Enter Programme zu jeder Zeit abzubrechen - dies sollte
  1324. aber nur dann geschehen, wenn Control-C nicht wirkt und das Programm nicht
  1325. gerade Betriebssystemaufrufe (z.B. Zugriff auf die Disk oder Grafikausgaben
  1326. auf dem Bildschirm) durchführt, da es sonst zu Fehlverhalten des Systems
  1327. kommen kann. Nähere Informationen im Definitionstext des Moduls UserBreak.
  1328.  
  1329. Anwender eines Drucker-Spoolers oder der Flexdisk sollten die Option Maximaler
  1330. Kopierpuffer gegebenenfalls deaktivieren, ansonsten bietet es sich fast immer
  1331. an, diese Option zu nutzen, denn dadurch wird bei Kopiervorgängen fast der
  1332. gesamte  Speicherplatz  verwendet,  um  den  Kopiervorgang  möglichst  schnell
  1333. durchzuführen.
  1334.  
  1335. Unter Make wird der Name des Make-Programms eingetragen - dies ist in der
  1336. Regel MM2Make.
  1337.  
  1338. In Temp. Pfad sollte ein Ordnername eingetragen werden, in dem die Shell und
  1339. die Hilfsprogramme kurzzeitig kleine Dateien ablegen können. So  legt  Make
  1340. dort beispielsweise die Steuerdatei der evtl. zu übersetzenden Module für den
  1341. Compiler ab. Nach Möglichkeit sollte dieser Pfad auf einem schnellen Gerät
  1342. liegen, also eher auf einer RAM-Disk als einer Diskette - ein Pfad auf der
  1343. Harddisk reicht natürlich auch aus.
  1344.  
  1345. Die Batch-Datei (mit der Endung M2B) ist diejenige, die ausgeführt wird, wenn
  1346. die  darunter  angegebene  Parameterdatei  (teilweise  auch  als  Projekt-Datei
  1347. bezeichnet) aktiviert oder "ausgeführt" wird. Diese  wiederum  kann  aktiviert
  1348. werden, indem sie - vorausgesetzt, sie hat die Dateiendung M2P - auf ge~
  1349. wohnte  Weise  (Doppelklick,  Ziehen  auf  das  Ausführen-Symbol,  Starten  als
  1350. Tool)  "ausgeführt"  wird.  Einen  Sonderstatus  genießt  die  Parameterdatei
  1351. 2.2  Bedienung: Shell                                                     2 - 30
  1352. ________________________________________________________
  1353.  
  1354.  
  1355. MM2SHELL.M2P: Sie wird beim Starten der Shell, wenn sie  sich  in  deren
  1356. Verzeichnis befindet, automatisch ausgeführt. Somit muß die Batch-Datei, die
  1357. beim Start der Shell ausgeführt werden soll, nicht zwingend "MM2SHELL.M2B"
  1358. heißen, sondern lediglich als Batch-Datei der Parameterdatei MM2SHELL.M2P
  1359. definiert sein.
  1360.  
  1361. Um eine neue Parameter- oder Batch-Datei zu erstellen, können Sie folgen~
  1362. dermaßen  vorgehen:  Tragen  Sie  eine  beliebige  Datei  der  Endung  M2B  als
  1363. Batch-Datei und ebenso eine der Endung M2P (z. B. MM2SHELL.M2P für die
  1364. Autostart-Parameter) als Parameterdatei ein. Dann verlassen Sie den Shell-
  1365. Parameter-Dialog und wählen Parameter/speichern... an. So werden die aktu~
  1366. ellen Einstellungen unter der gewählten Parameterdatei gesichert.
  1367.  
  1368.  
  1369. Die Umgebungsinformationen (Info/Umgebung...)
  1370.  
  1371. Letzter  Code/Länge  infor~
  1372. mieren über die vom letzten
  1373. Compileraufruf erzeugte Code-
  1374. Datei und dessen Länge.
  1375.  
  1376. Normalerweise    wird    der
  1377. aktuelle   Pfad   durch   das
  1378. oberste,   geöffnete   Disk-
  1379. Fenster bestimmt. Ist jedoch
  1380. keins offen,  kann  der  Pfad
  1381. hier abgelesen oder auch geändert werden. Das Ändern des Pfades hat keinen
  1382. Erfolg, wenn ein Fenster geöffnet ist - dieses hat dann Vorrang.
  1383.  
  1384. Die Default-Make-Datei wird aktiviert, wenn in der Shell die Taste M gedrückt
  1385. wird oder wenn vom Editor (GEP_ED oder GME) aus die Make-Funktion ange~
  1386. wählt wird. Das Aktivieren einer Make-Datei bewirkt den Aufruf des Make-
  1387. Programms, welches dann aufgrund der Informationen aus der Make-Datei (mit
  1388. Endung M2M) prüft, ob Dateien zu übersetzen sind und daraufhin dann den
  1389. Compiler dazu aufruft. Näheres in Kapitel 2.7.
  1390.  
  1391. Die Stack-Größe für das Load-Time-Linking wird den Anwendungsmodulen zur
  1392. Verfügung gestellt, wenn sie unter der Shell gestartet werden (gelinkte Program~
  1393. me haben bereits intern eine feste Einstellung - beim Linken von Megamax-
  1394. Modulen kann dieser Wert ebenfalls bestimmt werden, allerdings in den Lin~
  1395. ker-Optionen). Der anfangs eingestellte Wert von 16 K Bytes kann zu klein
  1396. sein, wenn das Programm rekursiv arbeitet oder große Datenstrukturen als
  1397. lokale Variablen verwendet (Sie erfahren dies dann während des Programm~
  1398. laufs durch die Fehlermeldung "Stack-Überlauf").
  1399.  
  1400. Taste nach TOS-Programmen: Wartet beim Ende von TOS-Programmen auf
  1401. einen Tastendruck, damit eventuelle Ausgaben noch gelesen werden können.
  1402. 2.2  Bedienung: Shell                                                     2 - 31
  1403. ________________________________________________________
  1404.  
  1405.  
  1406. Der aktuell freie Speicherplatz wird in zwei Werten angezeigt. Der linke gibt
  1407. den größten  zusammenhängenden  Bereich,  der  rechte  den  gesamten  freien
  1408. Platz an.
  1409.  
  1410.  
  1411. Tasten-Funktionen
  1412.  
  1413. Zusammenfassend haben folgende Tasten in der Shell eine Funktion:
  1414.  
  1415. Anfangsbuchstaben der Symbole: Sie bearbeiten alle die jeweils aktive Arbeits~
  1416. datei, es sei denn, es wird zusätzlich die Control-Taste gedrückt - dann wird
  1417. stattdessen die aktuelle Datei bearbeitet.
  1418.  
  1419.   A        Ausführen (von Programmen, Modulen, Make, Batch, Projektdateien)
  1420.                  Wird dabei Shift festgehalten, kann eine Argumentzeile (wie
  1421.                  bei  TTP  bzw.  MTP-Programmen)  eingegeben  werden,  beim
  1422.                  Festhalten von Alternate bleibt der aktuelle Pfad erhalten.
  1423.   C        Compilieren (Übersetzen)
  1424.   +         Compilieren, dann Ausführen
  1425.   E        Laden der Datei in den Editor
  1426.   L         Linken (Binden der Module zu einem Programm)
  1427.   S        Aktivieren des Scanners
  1428.                  Falls  vorher  bei  einem  Programmaufruf  ein  Laufzeitfehler
  1429.                  auftrat und die Scanner-Dialogbox erschien, kann durch Ein~
  1430.                  gabe von Shift-S der letzte Dialog wiederholt werden, um eine
  1431.                  andere Textposition anzuscannen (siehe Kapitel 2.5).
  1432.   P        Eingabe der Arbeits- oder aktuellen Datei über Tastatur.
  1433.  
  1434. Weitere spezielle Funktionen, die nicht aus den Menüzeilen ersichtlich sind:
  1435.  
  1436.   M        Make-Vorgang mit der Default-Make-Datei einleiten.
  1437.   Ctrl-R   Laden der aktuellen Code-Datei.
  1438.   R        Anzeige der geladenen Module und gelinkten Programme.
  1439.   Alt-R    Anzeige aller im Speicher vorhandenen (residenten) Module.
  1440.  
  1441. Bleiben noch folgende versteckte Funktionen:
  1442.  
  1443.   Esc      Neuanzeige des Inhalts des obersten Fensters, z.B. nach Wechseln
  1444.             einer Diskette;
  1445.             Während des Starts der Shell kann durch Druck auf diese Taste
  1446.             verhindert werden, daß Programme durch den Start-Batch geladen
  1447.             werden.
  1448.   Home    Schließt das Verzeichnis des aktiven Fensters.
  1449.   Clr       (Shift-Home)  Schließt  das  aktive  Fenster.  Werden  beide  Shift-
  1450.             Tasten festgehalten, werden alle Fenster geschlossen.
  1451.   Ctrl-Q   Beenden der Shell ohne Nachfrage zum Sichern der Einstellungen.
  1452. 2.2  Bedienung: Shell                                                     2 - 32
  1453. ________________________________________________________
  1454.  
  1455.  
  1456. Batch-Dateien
  1457.  
  1458. In Batch-Dateien können häufig benötigte Shell-Operationen und -Einstellungen
  1459. beschrieben und dann jederzeit zur Ausführung gebracht werden. Außerdem
  1460. werden hiermit die Suchpfade der Dateien für Shell, Editor, Compiler, Linker
  1461. und Make eingegeben. Die Batch-Datei ist ein normaler ASCII-Text, der alle
  1462. Anweisungen  im  Klartext  enthält,  daher  können  Sie  diese  Datei  mit  dem
  1463. mitgelieferten Editor bearbeiten.
  1464.  
  1465. Eine besondere Batch-Datei ist diejenige, die in den Shell-Parametern unter
  1466. Batch-Datei  eingetragen  ist:  Sie  wird  automatisch  beim  Start  der  Shell
  1467. ausgeführt. Üblicherweise enthält diese Datei Anweisungen, um Module (auch
  1468. gelinkte Programme) zu laden und um vor allem die Suchpfade zu bestimmen,
  1469. damit überhaupt ein Arbeiten in der Shell möglich ist.
  1470.  
  1471. Im  folgenden  wird  zunächst  die  Syntax  der  Batch-Dateien  beschrieben  (in
  1472. Backus-Naur-Form, siehe Anhang A.6); anschließend erläutern wir die Funktion
  1473. der einzelnen Anweisungen:
  1474.  
  1475. Syntax der Batch-Dateien
  1476.  
  1477. anweisung  =    IF SHELLSTART anweisung <cr> |
  1478.                     _
  1479.                   WAIT text <cr> |
  1480.                   * text <cr> |
  1481.  
  1482.                   SETPATH pfad <cr> |
  1483.                   SETDRIVE laufwerk <cr> |
  1484.                   SETDIR pfad <cr> |
  1485.  
  1486.                   DELETETOOLS <cr> |
  1487.                   TOOL dateiname <cr> |
  1488.  
  1489.                   LOAD dateiname <cr> |
  1490.                   UNLOAD dateiname <cr> |
  1491.  
  1492.                   STACKSIZE cardinal <cr> |
  1493.                   EXEC dateiname  argument  <cr> |
  1494.                   IF EXITCODE integer anweisung <cr> |
  1495.                     _
  1496.  
  1497.                   DEFOUT   pfad   <cr> |
  1498.                   IMPOUT   pfad   <cr> |
  1499.                   MODOUT   pfad   <cr> |
  1500.                   MAINOUTPUTPATH   pfad   <cr> |
  1501.  
  1502.                   COMPILE dateiname <cr> |
  1503.                   MAKE   dateiname   <cr> |
  1504. 2.2  Bedienung: Shell                                                     2 - 33
  1505. ________________________________________________________
  1506.  
  1507.  
  1508.                   LINKSTACKSIZE cardinal <cr> |
  1509.                   NO OPTIMIZE <cr> |
  1510.                      _
  1511.                   PART OPTIMIZE <cr> |
  1512.                        _
  1513.                   FULL OPTIMIZE <cr> |
  1514.                        _
  1515.                   DRIVER   '+' | '-'   dateiname <cr> |
  1516.                   DELETEDRIVERS <cr> |
  1517.                   LINK dateiname <cr> |
  1518.  
  1519.                   DEFAULTPATH pfad-liste <cr> |
  1520.                   DEFPATH pfad-liste <cr> |
  1521.                   IMPPATH pfad-liste <cr> |
  1522.                   MODPATH pfad-liste <cr> |
  1523.                   SOURCEPATH pfad-liste <cr>  .
  1524.  
  1525. pfad-liste  =     <cr> Leerzeichen  Leerzeichen  pfad   .
  1526. pfad        =     laufwerk       'ü'         name | '..'   'ü'   .
  1527. dateiname  =   pfad name
  1528. name       =   prefix   '.' suffix              (einfacher Dateiname ohne Pfad )
  1529. laufwerk   =   Buchstabe ':'
  1530. prefix      =   Bis zu acht Buchstaben oder Ziffern
  1531. suffix      =   Bis zu drei Buchstaben oder Ziffern
  1532. argument  =   Ein Wort (Text, der nicht durch Leerzeichen unterbrochen ist)
  1533. text        =   Beliebiger Text
  1534. cardinal    =   Positive, ganze Zahl (0 bis 2^32-1)
  1535. integer     =   Ganze Zahl (-32767 bis 32768)
  1536.  
  1537. Die Anweisungen sowie alle Teile von Datei- und Pfadnamen dürfen sowohl in
  1538. Groß- als auch Kleinbuchstaben geschrieben sein.
  1539.  
  1540. Um einen Batch sowohl für die Erstinitialisierung für die Shell als auch allge~
  1541. mein verwendbar zu machen, ist es teilweise notwendig, bestimmte Funktionen
  1542. darin  nur  beim  Start  der  Shell  durchzuführen.  Wird  die  Anweisung
  1543. IF SHELLSTART vor eine normale Anweisung gestellt, wird sie nur berück~
  1544.   _
  1545. sichtigt, wenn der Batch beim Starten der Shell automatisch ausgeführt wird.
  1546.  
  1547. Mit WAIT wird der dahinter stehende Text in einer Alert-Box angezeigt und
  1548. erst bei Bestätigung des OK-Knopfs wird der Batch weiter abgearbeitet.
  1549.  
  1550. Teilweise  ist  es  wünschenswert,  bestimmte  Disk-Verzeichnisse  als  aktuelle
  1551. Pfade einzustellen. Jedes Laufwerk kann dabei ein eigenes aktuelles Verzeichnis
  1552. haben, zusätzlich gibt es ein aktuelles Laufwerk; das aktuelle Laufwerk bestimmt
  1553. mit seinem aktuellem Verzeichnis (Dir) den aktuellen Pfad. SETDRIVE wählt
  1554. mit  einem  angefügten  Laufwerksbuchstaben  das  aktuelle  Laufwerk,  SETDIR
  1555. bestimmt, falls beim Pfadnamen  kein  Laufwerk  angegeben  ist,  das  aktuelle
  1556. Verzeichnis des aktuellen Laufwerks, sonst den Pfad des angegebenen Lauf~
  1557. werks - das aktuelle Laufwerk wird jedoch nicht gewechselt (so kann damit das
  1558. 2.2  Bedienung: Shell                                                     2 - 34
  1559. ________________________________________________________
  1560.  
  1561.  
  1562. Verzeichnis auf einem anderen Laufwerk bestimmt werden). SETPATH schließ~
  1563. lich setzt den aktuellen Pfad, also das aktuelle Laufwerk mitsamt dem Ver~
  1564. zeichnis.
  1565.  
  1566. War  das  zu  kompliziert?  Dann  andersrum:  Normalerweise  verwenden  Sie
  1567. SETPATH.  Damit  geben  Sie  Laufwerk  und  Verzeichnis  an,  die  dann  zum
  1568. aktuellen werden. Das hat die gleiche Funktion wie die Eingabe des aktuellen
  1569. Pfads in den Umgebungsinformationen.
  1570.  
  1571. Wollen Sie aber auch die Pfade der anderen Laufwerke festlegen, verwenden
  1572. Sie für jedes Laufwerk SETDIR. Das wäre beispielsweise nützlich, wenn Sie die
  1573. Disk-Fenster in der Shell mit Shift bzw. der Einstellung Erzeuge Fenster auf
  1574. aktuellem Pfad (s. Shell-Parameter) öffnen wollen - dann wird der mit SETDIR
  1575. für das Laufwerk bestimmte Pfad  geöffnet.  Ebenso  wird  beim  GEM-Datei-
  1576. Selektor  ab  TOS  1.4  beim  Anklicken  eines  Laufwerks  dessen  aktuelles
  1577. Verzeichnis angezeigt.
  1578.  
  1579. Die Einträge im Tools-Menü können mit TOOL bestimmt werden. Bis zu zehn
  1580. Tools können eingetragen werden. Die Menüeinträge werden nacheinander auf~
  1581. gefüllt. Die dort aufgeführten Programme können durch die Menüanwahl oder
  1582. eine  Funktionstaste  bequem  ausgeführt  werden.
  1583.  
  1584. Für die Dateinamen bei TOOL gilt: Wird ein Pfad angegeben, wird beim Start
  1585. des Programms der Pfad zum aktuellen Pfad, ansonsten bleibt der in der Shell
  1586. gerade aktuelle Pfad erhalten.
  1587.  
  1588. Um alle Tools-Einträge zu löschen, dient die Anweisung DELETETOOLS.
  1589.  
  1590. Die LOAD-Anweisung veranlaßt die Shell, das angegebene Modul in den Spei~
  1591. cher zu laden, so, als ob es auf das Resident-Symbol gezogen würde. Die
  1592. Module stehen dann zum direkten Aufruf oder auch zum Import  in  andere
  1593. Module  zur  Verfügung  und  müssen  nicht  wiederholt  von  Diskette  geladen
  1594. werden. Besonders  interessant  ist  die  Möglichkeit,  Editor  und  Compiler  zu
  1595. laden - der Aufruf ist anschließend ohne Wartezeit möglich. UNLOAD gibt ge~
  1596. ladene Module entsprechend wieder frei.
  1597.  
  1598. Mit EXEC kann ein Programm oder Modul gestartet werden. Wenn es endet,
  1599. wird hinter der EXEC-Anweisung in der Batch-Datei fortgefahren. Nach der
  1600. Rückkehr kann über IF EXITCODE der Rückgabewert des Progamms geprüft
  1601.                         _
  1602. werden.  Nur,  wenn  er  zutrifft,  wird  die  dahinter  stehende  Anweisung
  1603. ausgeführt.  Dies  kann  zum  Beispiel  Verwendung  finden,  um  auf  abnorme
  1604. Abbruchbedingungen  eines  Programms  zu  reagieren:  Jedes  Programm  kann
  1605. beim Terminieren einen Integer-Wert zurückgeben. Bei Megamax-Programmen
  1606. kann dies über die Prozedur TermProcess aus dem Modul PrgCtrl geschehen.
  1607. Jedes Programm das normal terminiert, liefert als Rückgabewert  (Exitcode)
  1608. Null. Nun könnten Sie ein Programm schreiben, das mit einem anderen Wert
  1609. 2.2  Bedienung: Shell                                                     2 - 35
  1610. ________________________________________________________
  1611.  
  1612.  
  1613. terminiert, um beispielsweise damit dem Aufrufer anzuzeigen, daß ein anderes
  1614. Programm gestartet werden soll. Nehmen wir an, das Programm heißt A und
  1615. wenn es den Wert Eins zurückgibt, soll B gestartet werden. Also ist ein Batch
  1616. zu schreiben, der die folgenden beiden Zeilen enthält:
  1617.       EXEC  A
  1618.       IF EXITCODE  1  B
  1619.         _
  1620. Wird dieser Batch gestartet, läßt er A ausführen. Terminiert A, wird B nur
  1621. gestartet, wenn der Exitcode von A Eins ist.
  1622.  
  1623. STACKSIZE erlaubt die Einstellung der Stackgröße, die gestarteten Programmen
  1624. zur  Verfügung  gestellt  wird.  Normalerweise  wird  die  Stack-Größe  in  den
  1625. Umgebungsinfomationen (s.o.) bestimmt, jedoch kann es notwendig sein, diesen
  1626. Wert vor dem Starten bestimmter Module mit dem EXEC-Befehl zu ändern.
  1627.  
  1628. Ein Modula-Programm kann  mit  COMPILE  und  einem  angefügten  Quelltext-
  1629. (Source-) Namen übersetzt werden. Tritt dabei ein Übersetzungsfehler auf,
  1630. wird eine entsprechende Meldung angezeigt. Der Fehler kann dann wahlweise
  1631. ignoriert werden, so daß der Batch bei der nächsten Anweisung fortfährt oder
  1632. der Editor gestartet wird (dann ist die Batch-Abarbeitung abgebrochen  und
  1633. muß bei Bedarf erneut gestartet werden).
  1634.  
  1635. Mit  DEFOUT,   IMPOUT,   MODOUT   und   MAINOUTPUTPATH   können   die
  1636. Ausgabepfade des Compilers abweichend von der Standard-Einstellung (siehe
  1637. Kapitel  2.4,  Compiler)  bestimmt  werden.  Allerdings  werden  sie  nicht
  1638. automatisch am Ende des Batch-Laufs wieder auf ihre alten Werten gestellt.
  1639. DEFOUT, IMPOUT und MODOUT  können  nicht  rückgängig  gemacht  werden,
  1640. höchstens   durch   Neudefinition   der   Suchlisten   (DEFPATH,   IMPPATH,
  1641. MODPATH). Dagegen kann MAINOUTPUTPATH  durch  eine  leere  Pfadangabe
  1642. wieder ungültig gemacht werden. Nach einem Compiler-Fehler mit Aufruf des
  1643. Editors (oder Abbruch des Batch-Laufs) wird diese Anweisung allerdings nicht
  1644. mehr ausgeführt - dann muß ggf. die Einstellung des Ausgabe-Pfads in den
  1645. Compiler-Optionen (Parameter/Compiler) rückgängig gemacht werden.
  1646.  
  1647. Der Make-Vorgang kann durch die Anweisung MAKE gestartet werden. Wird
  1648. kein  Name  einer  Make-Datei  (Endung  M2M,  mit  Hilfsprogramm  ModRef
  1649. erstellt) angegeben, wird die Default-Make-Datei der Umgebungsinformationen
  1650. verwendet, ansonsten die angegebene.  Bei  einem  Fehler  in  der  Make-Datei
  1651. oder beim darauf folgenden Übersetzungsvorgang wird so verfahren, wie schon
  1652. oben bei der COMPILE-Anweisung beschrieben.
  1653.  
  1654. Um ein Programm im Batch zu binden, ist LINK zu verwenden. Der dahinter
  1655. anzugebende Modulname darf eine Pfadangabe enthalten. Ist dies der Fall, wird
  1656. die zu erzeugende gelinkte Programmdatei auf dem angegebenen Pfad erzeugt,
  1657. ansonsten dort, woher das angegebene Modul stammt. Der Optimierungsgrad,
  1658. die Stack-Größe, die das gelinkte Programm verwenden soll sowie die einzu~
  1659. bindenden Treiber-Module werden normalerweise in der Dialogbox des Linkers
  1660. 2.2  Bedienung: Shell                                                     2 - 36
  1661. ________________________________________________________
  1662.  
  1663.  
  1664. (Parameter/Linker) bestimmt (dazu mehr in Kapitel 2.6 über den Linker). Diese
  1665. Eintragungen können aber optional auch vom Batch verändert werden (natürlich
  1666. müssen sie vor dem betreffenden Linker-Aufruf abgearbeitet werden!):
  1667.  
  1668. LINKSTACKSIZE bestimmt mit der angegebenen Zahl die Stackgröße für das
  1669. zu linkende Programm; sie sollte mindestens 2000 (Bytes) betragen. Mit einer
  1670. der Anweisungen NO OPTIMIZE, PART OPTIMIZE oder FULL OPTIMIZE wird
  1671.                       _                  _                      _
  1672. keine, verkürzte bzw. vollständige Optimierung des Programms erreicht. Nach
  1673. DRIVER  kann  ein  Treiber-  (Konfigurations-)  Modul  angegeben  werden.
  1674. Insgesamt  können  bis  zu  acht  solcher  Module  eingetragen  werden.  Dem
  1675. Modulnamen hinter  DRIVER  kann  ein  Plus-  oder  Minuszeichen  vorangestellt
  1676. werden  (ohne  Leerzeichen!),  je  nachdem  wird  es  als  selektiertes  oder
  1677. abgeschaltetes Modul eingetragen (nur selektierte Module werden beim Linken
  1678. als Treiber mit eingebunden) ist kein solches Zeichen vor dem Namen, wird
  1679. das Modul als selektiert übernommen. Ein bereits konfiguriertes Modul wird
  1680. nicht doppelt eingetragen, sondern die neue Definition überschreibt dann die
  1681. alte. Durch  die  Anweisung  DELETEDRIVERS  können  allerdings  alle  Treiber-
  1682. Eintragungen gelöscht werden.
  1683.  
  1684. Um die weiteren Einträge der Batch-Datei zu erklären, holen wir etwas weiter
  1685. aus - als Vorwarnung spendieren wir eine neue Überschrift:
  1686.  
  1687.  
  1688. Suchpfade und Pfadlisten
  1689.  
  1690. Zu guter Letzt können Sie in der Batch-Datei verschiedene Pfadlisten angeben -
  1691. also Listen von Directories, die beim Suchen verschiedener Dateitypen abge~
  1692. sucht werden sollen. Vier dieser Pfadlisten werden ausschließlich vom Modula-
  1693. System selbst (Compiler, Linker) benutzt:
  1694.  
  1695. DEFPATH       für übersetzte Definitionsmodule:
  1696.                  Hier sucht der Compiler die Definitionsdateien (Endung DEF)
  1697.                  der importierten Module.
  1698.                  Im ersten angegebenen Pfad legt der Compiler neu erzeugte
  1699.                  (übersetzte) Definitionsdateien ab.
  1700.  
  1701. IMPPATH       für übersetzte Implementationsmodule,
  1702. MODPATH      für übersetzte Haupt- (Programm-) Module:
  1703.                  Auf  diesen  beiden  Pfadlisten  sucht  der  Linker  (nicht  der
  1704.                  Loader!)  nach  einzubindenden  Modul-Codes,  die  vom  zu
  1705.                  linkenden Programm importiert werden.
  1706.                  Im ersten angegebenen Pfad legt der Compiler neu erzeugte
  1707.                  (übersetzte) Implementations- bzw. Haupt-Modul-Codes ab.
  1708.  
  1709. SOURCEPATH  für alle Quelltexte (Sourcen):
  1710.                  Hier suchen Compiler und Editor nach den Quelltexten, wenn
  1711.                  diese nicht auf dem angegebenen Pfad zu finden sind.
  1712. 2.2  Bedienung: Shell                                                     2 - 37
  1713. ________________________________________________________
  1714.  
  1715.  
  1716. Die Modula-Shell selbst (bzw. deren Loader) sucht alle Module, die ausgeführt
  1717. werden sollen, in der DEFAULTPATH-Liste. Das gilt auch für Module, die per
  1718. LOAD-Anweisung in der Batch-Datei geladen werden sollen. Eventuelle LOAD-
  1719. Anweisungen in der Batch-Datei, die beim Shell-Start automatisch ausgeführt
  1720. wird,  sollten  also  hinter  der  dort  -  notwendigerweise  -  aufgeführten
  1721. DEFAULTPATH-Definition stehen.
  1722.  
  1723. Außerdem steht die DEFAULTPATH-Liste Systemprogrammen, wie dem Make,
  1724. zur Verfügung: Die Variable StdPaths im Modul ShellMsg enthält eine kodierte
  1725. Form dieser Liste (vom Datentyp PathList). In der Dokumentation (Definitions~
  1726. modul) zum Modul Paths erfahren Sie, wie Sie durch einfachen Aufruf einer
  1727. Prozedur eine Datei in allen Verzeichnissen dieser (oder auch einer anderen)
  1728. Pfadliste suchen lassen können. Um auf einfache Weise anwenderfreundliche
  1729. Programme zu verwirklichen, ist die Benutzung dieser Suchfunktion vor dem
  1730. Zugriff  auf  Dateien  sehr  empfehlenswert.  Um  die  Pfadliste  für  gelinkte
  1731. Programme, also außerhalb der Shell, anzulegen, gibt es das Modul InitPathList
  1732. im UTILITY-Ordner.
  1733.  
  1734. Vorsicht!
  1735.       Es ist unbedingt darauf  zu  achten,  daß  nach  einer  Pfadlisten-
  1736.       Anweisung  die  in  den  folgenden  Zeilen  aufgeführten  Pfade  alle
  1737.       mindestens  um  ein  Leerzeichen  eingerückt  sind  und  keine
  1738.       Leerzeilen bis zum Ende der Liste vorkommen!
  1739.  
  1740. Die Syntax der Pfadnamen wird weiter unten erklärt für den Fall, daß Sie mit
  1741. ihr noch nicht vertraut sind.
  1742.  
  1743. Wird ein Pfadname mit einem Sternchen (und einem darauf folgenden Ordner-
  1744. Trennstrich,  also  "*ü")  angeführt,  wird  es  von  den  Systemprogrammen
  1745. (Compiler, Make, Shell usw.) durch den Pfad der Shell ersetzt (dieser steht im
  1746. Modul ShellMsg). Damit können die Pfade so angegeben werden, daß die Shell
  1747. zusammen mit ihren Unterverzeichnissen problemlos in jeden beliebigen Ordner
  1748. (einer ausreichend großen Harddisk) kopiert werden kann und erstmal keine
  1749. Korrekturen an den Pfadlisten vorgenommen zu werden brauchen, um mit dem
  1750. System arbeiten zu können. Dies wurde übrigens auch bei der Zusammen~
  1751. stellung des Megamax-Systems  auf  Ihren  erworbenen  Disketten  ausgenutzt
  1752. (siehe die Batch-Datei MM2SHELL.M2B).
  1753.  
  1754. Am  Ende  der  Pfadliste  kann  ein  Fragezeichen  als  Dateiname  eingetragen
  1755. werden.  Dies  bewirkt,  daß  die  GEM-Dateiauswahl-Funktion  (File-Selektor)
  1756. aufgerufen wird, wenn eine gesuchte Datei nicht auf den vorigen Pfaden der
  1757. Liste gefunden werden kann.
  1758. 2.2  Bedienung: Shell                                                     2 - 38
  1759. ________________________________________________________
  1760.  
  1761.  
  1762. Der Aufbau einer Pfadangabe ist zwar nicht Megamax-spezifisch,  soll  aber
  1763. doch noch kurz erläutert werden:
  1764.  
  1765. * Die Laufwerksangabe durch Laufwerksbuchstaben und Doppelpunkt ist optio~
  1766. nal; wenn sie fehlt, wird das gerade aktive Laufwerk benutzt.
  1767.  
  1768. * Der folgende Schrägstrich gibt an, daß vom Stamm-Inhaltsverzeichnis (auch
  1769. Wurzel- oder Root-Directory) des Laufwerks ausgegangen wird. Fehlt er, dann
  1770. beginnt der Pfad im gerade aktiven Verzeichnis, das sich der Atari zu jedem
  1771. Laufwerk einzeln merkt.
  1772.  
  1773. *  Beginnen  Sie  im  aktiven  Verzeichnis,  so  können  Sie  zunächst  ins
  1774. übergeordnete Verzeichnis heraufsteigen, indem Sie '..ü' folgen lassen.
  1775.  
  1776. * Nachdem nun der Ausgangspunkt des Pfades definiert ist, können Sie sich
  1777. von dort beliebig tief in Ordner (Subdirectories) 'hineinwühlen'. Die Ordnerna~
  1778. men werden in der Reihenfolge angegeben, in der Sie immer tiefer in sie 'hin~
  1779. eintauchen'. Zur Trennung der Namen dient wieder der Schrägstrich.
  1780.  
  1781. * Am Ende eines Pfadnamens sollte immer ein Schrägstrich stehen (ggf. fügt
  1782. die Shell beim Einlesen des Pfades selbst einen an).
  1783.  
  1784. Um die Verwirrung etwas zu lindern, hier ein Beispiel. Betrachten wir folgende
  1785. Directory-Struktur:
  1786.  
  1787.       Disk A:             <Wurzel>
  1788.                              5 8
  1789.                   MODULA      ZAEH
  1790.                      5 8
  1791.               SHELL     LIBRARY
  1792.                            5 8
  1793.                        IMP      DEF
  1794.  
  1795. Angenommen, Sie wollen einen Pfad ins 'DEF'-Verzeichnis konstruieren (etwa
  1796. für die DEFPATH-Liste in der Batch-Datei). Die ausführlichste Angabe wäre
  1797. "A:üMODULAüLIBRARYüDEFü".  Das  funktioniert  natürlich  nur,  solange  die
  1798. Diskette in Laufwerk A bleibt... Aber  Sie  wissen  ja,  daß  gerade  die  Shell
  1799. gestartet worden ist - also wird sicher das richtige Laufwerk gerade aktiv
  1800. sein. Daher genügt die Angabe "üMODULAüLIBRARYüDEFü".
  1801.  
  1802. Beide  oben  genannten  Pfade  beginnen  im  Wurzelverzeichnis.  Wenn  der
  1803. MODULA-Ordner in einen anderen Ordner hineinkopiert wird (oder wenn Sie
  1804. LIBRARY und SHELL  direkt  ins  Wurzelverzeichnis  legen),  schicken  Sie  den
  1805. Rechner auf den Holzweg. Noch flexibler ist es daher, den Pfad relativ zum
  1806. aktiven  Verzeichnis  (SHELL,  nehmen  wir  an)  anzugeben!  ..üLIBRARYüDEFü
  1807. tut's,  solange  der  LIBRARY-Ordner  neben  dem  SHELL-Ordner  in  einem
  1808. übergeordneten Verzeichnis steht.
  1809. 2.2  Bedienung: Shell                                                     2 - 39
  1810. ________________________________________________________
  1811.  
  1812.  
  1813. Umgang mit mehreren Projekten
  1814.  
  1815. Unter einem Projekt bei Megamax Modula-2 verstehen wir die Arbeit an einem
  1816. Programmpaket, das mehrere Module umfaßt und das seine eigene, individuelle
  1817. Umgebung hat.
  1818.  
  1819. Ein Beispiel: Nehmen wir an, Sie arbeiten abwechselnd an zwei Programmen,
  1820. das eine sei ein kleines Terminal-Programm (zur Daten-Kommunikation über
  1821. Telefon), das andere ein Grafikprogramm zur Darstellung von physikalischen
  1822. Vorgängen. Nun bietet es sich an, die jeweils projekt-spezifischen Dateien in
  1823. getrennten Ordner zu sammeln. Denken wir uns, Sie hätten zwei Ordner auf
  1824. Ihrer  Harddisk  (ja,  sowas  braucht  man  heutzutage),  je  einen  für  jedes
  1825. Programmpaket,  in  denen  die  jeweiligen  Quelltext-Dateien  abgelegt  werden
  1826. sollen.
  1827.  
  1828. Da die beiden Programme vielleicht auch verschiedene Optionen (Stack-Größe,
  1829. Treiber-Module usw.) benötigen, sollten Sie sich dafür je eine Projekt-Datei
  1830. anlegen. Diese Projekt-Dateien sind praktisch die Parameter-Dateien mit den
  1831. Endungen M2P.  Wenn  Sie  alles  richtig  installiert  haben,  können  Sie  durch
  1832. einfache Aktionen zwischen Ihren beiden Projekten hin- und herwechseln und
  1833. finden bei beiden die individuellen Einstellungen und Arbeitsdateien vor.
  1834.  
  1835. Kommen wir also zum Erstellen einer Projekt-Datei. Zuerst erstellen Sie eine
  1836. Batch-Datei, die die gewünschten Suchpfade enthält. Nehmen Sie am besten
  1837. Ihre Standard-Batch-Datei MM2SHELL.M2B und verändern Sie die Pfadlisten
  1838. darin, so daß die zusätzlichen Ordner für das jeweilige Projekt berücksichtigt
  1839. werden. Am besten ist es, diese Pfade immer als erstes in die Listen  zu
  1840. schreiben,  damit  sie  Vorrang  vor  den  restlichen  haben.  Speichern  Sie  die
  1841. Batch-Datei dann unter einem anderen Namen wieder ab.
  1842.  
  1843. Daraufhin  tragen  Sie  den  Namen  hinter  der  Batch-Datei  in  den  Shell-
  1844. Parametern ein. Dann vergeben Sie auch einen neuen Namen für die dortige
  1845. Parameter-Datei. Nun können Sie Ihr Disk-Verzeichnis des  Projekt-Ordners
  1846. öffnen, die verwendeten Quelltexte als Arbeitsdateien eintragen und sonstige
  1847. Parameter einstellen, beispielsweise die  Stack-Größe  oder,  wenn  das  feste
  1848. Linken  des  Programms  öfter  benötigt  wird,  auch  die  Linker-Optionen
  1849. (verwendete Konfigurationsmodule usw.).
  1850.  
  1851. Sehr nützlich ist auch das Erzeugen einer Make-Datei zum Hauptmodul des
  1852. Projekts  (siehe  Kapitel  2.7  zum  Erstellen  einer  Make-Datei),  die  dann  als
  1853. Default-Make in den Umgebungsinformationen eingetragen wird.
  1854.  
  1855. Sind alle Einstellungen vorgenommen, kann durch Drücken von Control-X, der
  1856. Anwahl des Menüpunkts Parameter sichern oder einfach durch Verlassen der
  1857. Shell mit Parameter-Sicherung  die  vorher  als  Parameter-Datei  eingegebene
  1858. Projekt-Datei  gespeichert  werden.  Wenn  Sie  dann  die  Shell  neu  aufrufen,
  1859. 2.2  Bedienung: Shell                                                     2 - 40
  1860. ________________________________________________________
  1861.  
  1862.  
  1863. wird  erstmal  wieder  die  Standard-Einstellung  aus  der  Parameter-Datei
  1864. MM2SHELL.M2P  vorgenommen.  Sie  können  nun  aber  jederzeit  die  neu
  1865. angelegte Projekt-Datei ausführen, um deren Einstellungen wieder hervorzu~
  1866. holen, z.B. indem Sie die Projekt-Datei im Disk-Inhaltsverzeichnis suchen und
  1867. durch Doppelklick oder durch Ziehen auf das Ausführen-Symbol aktivieren. Ein
  1868. anderer,  sehr  bequemer  Weg  ist,  die  oft  verwendeten  Projekt-Dateien  als
  1869. Tools in der Standard-Batch-Datei einzutragen.
  1870.  
  1871. Sie können sogar schon beim Start der Shell dafür sorgen, daß statt  der
  1872. Standard-Parameter-Datei MM2SHELL.M2P eine andere verwendet wird: Dazu
  1873. müssen Sie die Shell unter dem GEM-Desktop für Dateien der Endung M2P
  1874. anmelden. Dann genügt ein Doppelklick auf die Projekt-Datei, um die Shell zu
  1875. starten und das Projekt sofort vor sich  zu  haben.  Um  dies  zu  erreichen,
  1876. klicken  Sie  im  GEM-Desktop  die  Shell  MM2SHELL.PRG  einfach  (also  nicht
  1877. starten!) an. Dann wählen Sie in der Menüzeile Extras/Anwendung anmelden.
  1878. Dort  geben  Sie  dann  als  geforderte  Endung  "M2P"  ein  und  klicken  auf
  1879. installieren. Zuletzt wählen Sie Arbeit sichern an. Daraufhin können Sie nun
  1880. auf jede M2P-Datei doppelt klicken, um die Shell damit zu starten. (Bei älteren
  1881. TOS-Versionen müssen Sie aber darauf achten, daß sich die Projekt-Dateien
  1882. im  Verzeichnis  der  Shell  befinden,  da  diese  sonst  nicht  gefunden  wird.
  1883. Probieren Sie dies ggf. aus.)
  1884. 2.2  Bedienung: Shell                                                     2 - 41
  1885. ________________________________________________________
  1886.  
  1887.  
  1888. Fehlermeldungen der Shell
  1889.  
  1890. Beim Programmieren kann erfahrungsgemäß einiges schiefgehen. Im Megamax
  1891. Modula-System gibt es vier Kategorien von Fehlermeldungen, die  in  solchen
  1892. Fällen erscheinen können.
  1893.  
  1894. * Ladefehler können auftreten, wenn ein Modul ausgeführt werden soll und nicht
  1895. alle benötigten Module zur Verfügung stehen. Die  Fehlermeldungen  beginnen
  1896. mit '<Modulname> konnte nicht ausgeführt werden', gefolgt von einer Beschreibung
  1897. des Problems. Diese Meldungen werden vom  Loader  erzeugt;  Erläuterungen
  1898. finden Sie im Kapitel 5.
  1899.  
  1900. * Laufzeitfehler treten bei der Ausführung fehlerhafter Anwenderprogramme
  1901. auf. Die Fehlerbeschreibung, der Modul- und der Prozedurname werden ange~
  1902. zeigt. Sie können sich entscheiden zwischen
  1903.  
  1904.     Back/Forward:
  1905.     erlauben die Suche nach der Fehlerposition im Text (siehe 2.5);
  1906.     Exit
  1907.     verläßt die Fehlersuche und bietet drei weitere Möglichkeiten:
  1908.  
  1909.     Cont
  1910.     setzt das Programm fort. Bei manchen fatalen Fehlern ist eine sinnvolle
  1911.     Fortsetzung nicht möglich, und diese Option wird nicht angeboten.
  1912.     Quit
  1913.     bricht das Programm ab und kehrt zurück zur Shell.
  1914.     Edit
  1915.     läßt die durch Forward/Back bestimmte Fehlerstelle suchen und im Editor
  1916.     anzeigen, sofern der Quelltext des Moduls vorhanden ist. (siehe 2.5)
  1917.  
  1918. Eine kommentierte Liste der Fehlermeldungen steht im Anhang A.2.
  1919.  
  1920. *  Übersetzungsfehler  entstehen  natürlich  beim  Compilieren.  Eine  Liste  der
  1921. Fehlermeldungen  enthält  der  Anhang  A.1;  wie  Sie  auf  Übersetzungsfehler
  1922. reagieren können, beschreibt Kapitel 2.4.
  1923.  
  1924. * Bedienungsfehler in der Shell. So kommen Meldungen, wenn Sie mehr als
  1925. sieben  Fenster  öffnen,  mehr  als  zehn  Arbeitsdateien  anfordern,  mehr
  1926. Programme laden wollen, als freier Speicher zur Verfügung steht, usw. Die
  1927. Meldungen sind alle selbsterklärend.
  1928. 2.2  Bedienung: Shell                                                     2 - 42
  1929. ________________________________________________________
  1930.  
  1931.  
  1932.  
  1933.  
  1934.  
  1935.  
  1936.  
  1937.  
  1938.  
  1939.  
  1940.  
  1941.  
  1942.  
  1943.  
  1944.  
  1945.  
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951.                                Diese Seite wurde blank geputzt.
  1952. 2.3  Bedienung: Editor                                                    2 - 43
  1953. ________________________________________________________
  1954.  
  1955.  
  1956. 2.3   Editor
  1957.  
  1958.  
  1959. Einführung
  1960.  
  1961. Als Teil des Megamax Modula-Systems haben Sie auch einen eigenen Editor
  1962. erhalten (genau genommen sogar zwei!). Er dient zur Eingabe (und Korrektur)
  1963. der  Programmtexte.  Die  Texte  werden  als  Standard-ASCII-Dateien  (direkt
  1964. lesbare Textdateien) abgelegt und dem Compiler übergeben.
  1965.  
  1966. Der Editor ist speziell zum Schreiben von Programmtexten konzipiert worden.
  1967. Ihre  Briefe  werden  Sie  vielleicht  auch  weiterhin  mit  einer  speziellen
  1968. Textverarbeitung  schreiben  wollen;  zum  Programmieren  bietet  Ihnen  der
  1969. Megamax-  Editor  aber  eine  Reihe  nützlicher  Sonderfunktionen  bei  über~
  1970. sichtlicher Bedienung.
  1971.  
  1972.  
  1973. Wahl des Editors
  1974.  
  1975. Prinzipiell können Sie jeden Editor verwenden, der normale Textdateien erzeugt
  1976. - die optimale Zusammenarbeit mit Shell und Compiler des Modula-Systems
  1977. erlauben allerdings nur die beiden mitgelieferten Editoren. (Die Zusammenarbeit
  1978. der Programme wird durch die Shell organisiert. Da Sie diese im Quelltext
  1979. erhalten, können Sie auch eine Anpassung für Ihren Lieblingseditor vornehmen,
  1980. wenn Sie sich nicht umstellen möchten - die wichtigste Änderung dürfte die
  1981. Übergabe der Fehlerposition und -meldung betreffen.)
  1982.  
  1983. Unser Standard-Editor heißt GME. Unter anderem erlaubt er, mehrere Texte
  1984. im  Speicher  zu  bearbeiten,  bietet  jedoch  bisher  noch  keine  echten  GEM-
  1985. Fenster,  statt  dessen  werden  die  Texte  auf  Befehl  abwechselnd  auf  dem
  1986. Bildschirm angezeigt. Die Bedienung ist dem Konzept des legendären Editors
  1987. Word-Star nachempfunden. Der GME ist einfach zu bedienen, vor allem wegen
  1988. seiner GEM-Menüleiste, deswegen empfehlen wir den Programmier-Einsteigern
  1989. diesen Editor zur Benutzung.
  1990.  
  1991. Alternativ bieten wir einen kompakteren und schnelleren Editor, der allerdings
  1992. mehr Eingewöhnung verlangt: Der Gepard-Editor (GEP ED). Auch er arbeitet
  1993.                                                          _
  1994. optimal  mit  dem  Entwicklungssystem  zusammen.  Er  ist,  wie  der  GME,  in
  1995. Modula geschrieben, hat jedoch einige deutliche  Optimerungen  in  Assembler
  1996. erfahren. Er belegt nur ca. 50KByte (GME: 150) des Speichers in der Shell
  1997. und ist deshalb bei knappem Speicher dem GME vorzuziehen.
  1998. 2.3  Bedienung: Editor                                                    2 - 44
  1999. ________________________________________________________
  2000.  
  2001.  
  2002. Der GME wurde aus einem Universaleditor  entwickelt,  der  auch  zur  Text~
  2003. verarbeitung geeignet war. Demgegenüber ist der Gepard-Editor speziell auf
  2004. das Programmentwickeln zugeschnitten und bietet keine GEM-Oberfläche - für
  2005. die  Veteranen:  Sein  Konzept  ist  dem  des  UCSD-Programmeditors  nach~
  2006. empfunden, nur ist er wesentlich schneller. Der Editor ist gewöhnungsbedürftig,
  2007. aber  unglaublich  effektiv  für  Vielprogrammierer  -  wir  Megamax-Entwickler
  2008. verwenden ihn alle!
  2009.  
  2010. Beide Editoren erlauben es, den Programmtext im  Speicher  zu  übersetzen,
  2011. ohne daß der Text abgespeichert und der Editor verlassen zu werden braucht.
  2012. Dies verkürzt die Turn-Around-Zeit (Zeit zwischen Editieren, Übersetzen und
  2013. Starten) deutlich.
  2014.  
  2015. Auch Tempus (von CCD) läßt sich sehr bequem als Editor verwenden. Einzig
  2016. die Fehleranzeige vom Compiler beherrscht er nicht - die Shell sieht aber eine
  2017. Option vor, so daß Compilerfehler  vor  dem  Editor-Start  angezeigt  werden.
  2018. Nach einer Bestätigung mit der Return-Taste wird der Editor gestartet und er
  2019. zeigt dann die Fehlerposition im geladenen Text an.
  2020.  
  2021. Bei Tempus können Sie ein Programm zwar nicht im Speicher direkt überset~
  2022. zen lassen, aber der Komfort kommt auch hier nicht zu kurz: Drücken Sie
  2023. Control-1 (Sie müssen die Eins vom rechten Ziffernblock verwenden!), wird der
  2024. Text automatisch gespeichert, Tempus verlassen und automatisch der Compiler
  2025. gestartet, der dann den Programmtext übersetzt, den Sie von der Shell an den
  2026. Editor beim Aufruf übergeben hatten (und das ist in der Regel auch der, den
  2027. Sie dann mit Control-1 zum Übersetzen abspeichern lassen). Control-2 teilt
  2028. der Shell mit, daß sie nach erfolgreicher Übersetzung dieses Modul starten
  2029. soll,  Control-3  bewirkt  nicht  das  Übersetzen  des  geladenen  Programms,
  2030. sondern aktiviert das Default-Make, das in der Shell auch über die Taste M
  2031. auslösbar ist. Schließlich läßt Control-4 nach dem - erfolgreichen - Make-Lauf
  2032. das Programm wiederum gleich starten.
  2033.  
  2034. Leider lassen sich die Versionen 2.00 bis 2.04 von Tempus nicht resident in
  2035. der Shell laden: Beim wiederholten Start in der Shell würde er nicht mehr
  2036. funktionieren. Wenden Sie sich in diesem Falle ggf. an CCD, um eine neuere,
  2037. korrigierte Version zu erhalten. Alle anderen Versionen lassen sich resident
  2038. laden, aber benötigen sehr (wirklich sehr) viel mehr Speicher als die Programm~
  2039. datei lang ist. Auch hier sollten Sie sich nicht verwirren lassen - das muß so
  2040. sein!
  2041. 2.3  Bedienung: Editor                                                    2 - 45
  2042. ________________________________________________________
  2043.  
  2044.  
  2045. Vorbereitungen und Parameter für den Editor
  2046.  
  2047. Bevor der Editor Ihres Ver~
  2048. trauens von der Shell richtig
  2049. aufgerufen   werden   kann,
  2050. muß    zumindest    dessen
  2051. Dateiname bekannt  gemacht
  2052. werden.      Unter      dem
  2053. Menüpunkt Parameter/Editor
  2054. sind  alle  Optionen  für  den
  2055. Editor erreichbar. Hier kann
  2056. hinter Editor:  dessen  Name
  2057. eingetragen werden. Soll der
  2058. GME verwendet werden, kann dieser Name, wie im Bild zu sehen, verwendet
  2059. werden. Für den  Gepard-Editor  ist  GEP ED  einzutragen,  bei  allen  anderen
  2060.                                             _
  2061. Editoren ist ihr vollständiger Dateiname inclusive seiner Endung zu verwenden
  2062. (Tempus: TEMPUS.PRG). Bei Editoren, die andere Dateien nachladen müssen,
  2063. wie eine RSC-Datei oder Konfigurationen, muß außerdem deren Pfadname mit
  2064. angegeben werden. Haben Sie beispielsweise einen Editor namens EDIT.PRG,
  2065. der im Ordner C:üTEXTE mitsamt seiner Resource-Datei EDIT.RSC steht, ist
  2066. C:üTEXTEüEDIT.PRG einzutragen.
  2067.  
  2068. Die mitgelieferten Editoren können, da sie mit dem Megamax-Modula-System
  2069. erstellt  wurden,  auf  die  Pfadlisten  in  ShellMsg  zugreifen,  speziell  auf  die
  2070. Suchpfade für die Quelltexte (über SourcePath in Batch zu bestimmen). So
  2071. brauchen  Sie  beim  Laden  eines  Textes  diesen  nicht  erst  in  den  vielen
  2072. Verzeichnissen zu suchen, statt dessen sucht der Editor die Datei selbständig
  2073. auf den Source-Pfaden. Wird ein anderer Editor verwendet, kann die Shell das
  2074. übernehmen, wenn sie beim Editor-Aufruf den Dateinamen übergibt. Dazu muß
  2075. nur die Option Shell durchsucht Source-Pfade für den Editor aktiviert sein.
  2076. Dann reicht es beispielsweise, in der Shell mit Control-P den Namen eines
  2077. Textes ohne dessen Pfad einzutippen und dann den Editor mit Control-E zu
  2078. starten.
  2079.  
  2080. Wenn Editoren es nicht vermögen, eine Fehlermeldung beim Aufruf übergeben
  2081. zu bekommen, um sie dann anzuzeigen, muß die Shell dies erledigen. Dazu
  2082. dient der Schalter Shell zeigt Compiler-Fehler vor Editor-Aufruf an.  Ist  er
  2083. eingeschaltet, zeigt die Shell nach einem Compiler-Fehler diesen an, und erst
  2084. nach Drücken der Return-Taste wird der Editor gestartet. Verträgt der Editor
  2085. die  Fehlermeldung  nicht  (z.B.  TEMPUS),  muß  außerdem  weiter  unten  bei
  2086. Argumentzeile der Schalter Fehlermeldung deaktiviert sein.
  2087.  
  2088. Die Temporären Dateien dienen zur Übergabe von Informationen an den Editor
  2089. und zurück an die Shell. Der einzige uns bekannte Editor, der diese Art der
  2090. Parameterübergabe unterstützt ist der Emacs-Editor. Der ist programmierbar,
  2091. und so hat ein Megamax-Anwender ein Programm erstellt, das es erlaubt, von
  2092. der  Shell  Textname,  Fehlermeldung  und  -position  anzunehmen  und  beim
  2093. 2.3  Bedienung: Editor                                                    2 - 46
  2094. ________________________________________________________
  2095.  
  2096.  
  2097. Verlassen die Shell wiederum zum Compiler-Start zu veranlassen, wie dies
  2098. auch bei den von den beiden Megamax-Editoren möglich ist. Sind Sie an dieser
  2099. EMACS-Einbindung interessiert, wenden Sie sich an Application Systems.
  2100.  
  2101. In  der  Argumentzeile  an  den  Editor  können  Textname,  Fehlermeldung  und
  2102. -position  vom  Compiler  bzw.  von  der  Shell  beim  Aufruf  an  den  Editor
  2103. übergeben werden. Die Megamax-Editoren erlauben alle Übergaben. TEMPUS
  2104. beispielsweise  erlaubt  die  Angabe  der  Cursorposition,  jedoch  nicht  die  der
  2105. Meldung, sodaß diese dann zu deaktivieren wäre.
  2106.  
  2107. Wollen Sie einen Editor verwenden, der noch andere  Bedingungen  an  seine
  2108. Benutzung stellt, z.B. daß bei der Fehlerposition die Werte für Spalte und Zeile
  2109. zu vertauschen wären, können Sie dies selbst an der Shell-Source vornehmen:
  2110. Der Editor-Aufruf wird in der Funktion hdedit vorbereitet. Die Fehlermeldung
  2111. vom Compiler wird bei einem der Aufrufe von hdedit aufbereitet. Nach der
  2112. Anpassung muß die Shell neu übersetzt und dann gelinkt werden. Zum Linken
  2113. bietet  sich  der  Batch  LINKSHEL.M2B  an,  der  dazu  alle  erforderlichen
  2114. Parameter einstellt.
  2115.  
  2116.  
  2117. Aufruf des Editors
  2118.  
  2119. Den Editor können Sie auf drei Wegen starten:
  2120.  
  2121.     * Aus der Shell: Klicken Sie das Editor-Symbol auf der Ar~
  2122.     beitsfläche an (Editieren der Arbeitsdatei)  oder  legen  Sie
  2123.     einen Dateinamen auf dem Editor-Symbol ab. Wollen Sie ein
  2124.     neues Dokument beginnen, so geben Sie zunächst einen leeren Namen an.
  2125.  
  2126.     * Nach Übersetzungsfehlern: Je nach Wahl der Editor-Optionen ruft die
  2127.     Shell den Editor sofort auf oder bietet Ihnen erst den Aufruf des Editors
  2128.     an. Wenn Sie dann diese Option wählen, wird automatisch der fehlerhafte
  2129.     Text geladen, der Cursor wird an der Fehlerstelle positioniert, und in der
  2130.     Kopfzeile des Editors erscheint eine Fehlerbeschreibung.
  2131.  
  2132.     * Nach Laufzeit-Fehlern: Wenn Ihnen der Text des fehler~
  2133.     haften Programms zur Verfügung steht, können Sie  nach
  2134.     Laufzeitfehlern die Scanner-Funktion wählen. Der Compiler
  2135.     ermittelt die Textposition,  an  der  der  Fehler  auftrat,  und  zeigt  Ihnen,
  2136.     genau wie bei Übersetzungsfehlern, die Fehlerstelle mit Beschreibung im
  2137.     Editor.
  2138.  
  2139.  
  2140. Bedienung des Editors
  2141.  
  2142. Die Bedienung der beiden Editoren wird in separaten Anleitungen beschrieben,
  2143. die Sie im Anhang finden.
  2144. 2.4  Bedienung: Compiler                                                 2 - 47
  2145. ________________________________________________________
  2146.  
  2147.  
  2148. 2.4    Compiler
  2149.  
  2150. Hier erläutern wir die eigentliche Handhabung des Modula-Compilers. Wenn Sie
  2151. sich über den übersetzten Sprachumfang oder die Compiler-Optionen in Quell~
  2152. texten informieren wollen, lesen Sie bitte Kapitel 3 dieses Handbuchs.
  2153.  
  2154.  
  2155. Aufruf des Compilers
  2156.  
  2157. Der Compiler wird aus der Shell gestartet, indem Sie
  2158. * eine Textdatei aus einem Disk-Fenster mit der Maus greifen
  2159.   und auf das Compiler-Symbol schieben;
  2160. * das Compiler-Symbol doppelt anklicken, um die Arbeitsdatei zu übersetzen;
  2161. * die Taste C drücken, um die Arbeitsdatei zu übersetzen (o. Ctrl-C für die
  2162.   aktuelle Datei).
  2163.  
  2164. Der Pfad der Quelldatei muß nicht angegeben werden - der Compiler sucht die
  2165. Datei automatisch auf den Source-Pfaden (SourcePath in der Batch-Datei).
  2166.  
  2167. Falls die angegebene Textdatei vom Compiler nicht gelesen werden kann, fragt
  2168. der Compiler Sie nochmals nach einem Datei-Namen. Durch eine Leereingabe
  2169. können Sie den Compiler dann auch wieder verlassen. Wenn der Text gefunden
  2170. wird, beginnt der Compiler die Übersetzung.
  2171.  
  2172. Die  Endungen  (Suffix,  Extension)  der  Quelldatei-Namen  sind  beliebig.  Bei
  2173. Megamax Modula verwenden wir in der Regel
  2174.   .M  für Haupt-Modul-Quellen (Bsp: MSHELL.M, TEXTDEMO.M),
  2175.   .I   für Implementationsmodul-Quellen (Bsp: DEBUG.I, MOSCONFI.I),
  2176.   .D  für Definitionsmodul-Quellen (Bsp: INOUT.D, DEBUG.D).
  2177.  
  2178. Benötigte Definitionsmodule  werden  automatisch  gesucht.  Als  Name  werden
  2179. dabei die ersten 8 Zeichen des Modulnamens (also nicht des Dateinamens!),
  2180. gefolgt von der Extension .DEF, angenommen. Diese Dateien werden auf allen
  2181. Pfaden  gesucht,  die  Sie  in  der  Batch-Datei  als  DefPath  angegeben  haben
  2182. (siehe Kapitel 2.2 - Shell).
  2183. 2.4  Bedienung: Compiler                                                 2 - 48
  2184. ________________________________________________________
  2185.  
  2186.  
  2187. Die erzeugten Dateien
  2188.  
  2189. Den  Namen  der  erzeugten  Code-Datei  bestimmt  der  Compiler  ebenfalls
  2190. automatisch. Wieder werden die ersten 8 Zeichen des Modulnamens verwendet;
  2191. die Extension lautet
  2192.  
  2193.   .MOD  für Programm-Modul-Codes,
  2194.   .DEF   für Definitions-Codes und
  2195.   .IMP   für Implementations-Codes.
  2196.  
  2197. Andere  Endungen  können  Sie  über  die  Compileroption  $E  einstellen  (siehe
  2198. Kapitel 3.3, Compileroptionen), z.B. MOS oder MTP (äquivalent zu TOS und
  2199. TTP bei gelinkten Programmen, während MOD wie PRG behandelt wird).
  2200.  
  2201. Die Standard-Endungen können Sie aber auch verändern - näheres dazu in
  2202. Kapitel 5.
  2203.  
  2204. Der  Ausgabepfad  für  das  übersetzte  Modul  wird  normalerweise  über  die
  2205. Suchpfade bestimmt, die in der Batch-Datei stehen, welche beim Start der
  2206. Shell ausgeführt wird: Der Compiler wählt jeweils den ersten Pfad aus der
  2207. Pfadliste für Definitions-, Implementations- oder Programm-Module. Über die
  2208. Batch-Anweisungen  DEFOUT,  IMPOUT  und  MODOUT  können  aber  auch
  2209. individuelle  Ausgabepfade  eingestellt  werden  -  sind  dahinter  keine  Pfade
  2210. angegeben, wird die Code-Datei in das Verzeichnis geschrieben, aus dem die
  2211. jeweilige Quell-Datei stammt.
  2212.  
  2213. Ist allerdings ein Pfad über die Batch-Anweisung MainOutputPath oder über die
  2214. Compiler-Parameter  in  der  Shell  (siehe  folgenden  Abschnitt  Compiler-
  2215. Parameter)  eingegeben,  hat  dieser  Vorrang  vor  allen   anderen   Pfad-
  2216. Bestimmungen!
  2217.  
  2218.  
  2219. Übersetzungsfehler
  2220.  
  2221. Findet der Compiler in dem übersetzten Programmtext einen Fehler, bricht er
  2222. den Übersetzungsvorgang ab und meldet dies der Shell, die dann entweder den
  2223. Editor  sofort  aufruft  oder  erst  ein  Fenster  öffnet,  in  dem  sie  Ihnen  die
  2224. Fehlermeldung  präsentiert  und  Sie  vor  die  Wahl  stellt,  die  Fehlerstelle  im
  2225. Editor zu korrigieren oder die Übersetzung ganz abzubrechen.
  2226.  
  2227. Um als Fehlermeldung eine Beschreibung des Problems ausgeben zu können,
  2228. benötigt der Compiler die Fehlerdatei. Sie heißt normalerweise 'MODULA.ERR'
  2229. Fehlt diese Datei, dann wird nur eine Fehlernummer angezeigt, deren Bedeu~
  2230. tung Sie im Anhang A.1 des Handbuchs nachschlagen können. Dort finden Sie
  2231. zu vielen Fehlermeldungen auch zusätzliche Hinweise, die bei der Behebung des
  2232. Fehlers helfen können.
  2233. 2.4  Bedienung: Compiler                                                 2 - 49
  2234. ________________________________________________________
  2235.  
  2236.  
  2237. Compiler-Parameter
  2238.  
  2239. Über die Anwahl Parameter/
  2240. Compiler im Menü der Shell
  2241. können Sie die globalen Op~
  2242. tionen  des  Compilers  ein~
  2243. stellen.
  2244.  
  2245. Ist  Ausgabe  der  Kurzmel~
  2246. dungen  mit  einem  Häkchen
  2247. versehen, werden die Namen
  2248. der importierten Module, der
  2249. übersetzten Prozeduren und
  2250. die  Anzahl  der  übersetzten
  2251. Zeilen ausgegeben. Die gleiche Funktion kann  in  Programmtexten  durch  die
  2252. Compileroption $Q gesteuert werden (siehe 3.3, Compilerdirektiven; dort finden
  2253. Sie auch Tips zur Anwendung dieser Option).
  2254.  
  2255. Ausgabepfad:  Soll  ein  übersetztes  Modul  nicht  auf  dem  Pfad  gespeichert
  2256. werden,  der  in  der  Start-Batch-Datei  für  die  entsprechende  Modulart
  2257. angegeben ist, kann hier ein anderer Pfad eingetragen werden, der dann auf
  2258. alle erzeugten Modularten wirkt. Dieser Pfad kann auch mit dem Batch-Befehl
  2259. MAINOUTPUTPATH bestimmt werden. Siehe auch Kapitel 2.2 zu den Batch-
  2260. Anweisungen.
  2261.  
  2262. Die Direktiven erlauben die Beeinflussung des Verhaltens des Compilers beim
  2263. Übersetzen. Beispielsweise können Sie bestimmen, ob zusätzlicher Code für
  2264. Laufzeitprüfungen erzeugt werden soll. Näheres zur Funktion den Direktiven in
  2265. Kapitel 3.4. Statt die Direktiven in den Quelltext einzufügen, können sie hier in
  2266. der Eingabezeile voreingestellt werden. Jeder Direktiven-Buchstabe muß dabei
  2267. mit  einem  Plus-  bzw.  Minuszeichen  eingeleitet  werden,  mehrere  Direktiven
  2268. werden  durch  Leerzeichen  getrennt.  Im  Bild  sehen  Sie  beispielsweise  die
  2269. Direktiven $Z+ und $R-.
  2270.  
  2271. In der Library MM2DEF.M2L sind (fast) alle übersetzten Definitionsdateien der
  2272. Megamax-Bibliotheken  zusammengefaßt.  Dies  spart  Platz  auf  der  Disk  und
  2273. beschleunigt den Übersetzungsvorgang. Normalerweise sollte deshalb der Name
  2274. der  Datei  (mit  Pfad)  unter  Bibliothek  eingetragen  sein.  Ist  eine  Bibliothek
  2275. angegeben, haben die darin enthaltenen DEF-Dateien immer Vorrang vor den
  2276. separaten Definitions-Modulen in den Ordnern, die in der Pfadliste DefPath im
  2277. Batch angegeben werden können! Unter Umständen kann dies nicht erwünscht
  2278. sein - dann braucht einfach nur der Bibliotheksname gelöscht zu werden. Zur
  2279. Kontrolle, woher ein Definitionsmodul beim Übersetzen geladen wird, kann die
  2280. Anzeige der Kurzinformationen aktiviert werden.
  2281.  
  2282. Die Textdatei mit den Fehlermeldungen für den Compiler wird in Fehlerdatei
  2283. eingetragen, ggf. mitsamt dem Pfad.
  2284. 2.4  Bedienung: Compiler                                                 2 - 50
  2285. ________________________________________________________
  2286.  
  2287.  
  2288. Protokoll: Auf Wunsch erzeugt der Compiler  ein  Übersetzungsprotokoll.  Die
  2289. Ausgabebreite  (Anzahl  Spalten)  und  der  Name  der  Protokolldatei  (mit
  2290. Pfadangabe) können eingestellt werden. Der Inhalt der Protokolldatei wird in
  2291. einem speziellen Abschnitt auf einer der folgenden Seiten beschrieben.
  2292.  
  2293.  
  2294. Definitions-Codes: Bibliothek und Komprimierung
  2295.  
  2296. Die  übersetzten  Definitionsmodule  werden  vom  Compiler  praktisch  immer
  2297. benötigt,  darüber  hinaus  stören  sie  nur,  weil  sie  sonst  in  keiner  Weise
  2298. Verwendung finden.
  2299.  
  2300. Deshalb haben wir es ermöglicht, daß die Definitions-Codes alle in einer Datei
  2301. zusammengefaßt werden können. Damit ist das Weiterkopieren einfacher, es
  2302. werden nicht unzählige Verzeichnis-Einträge auf der Disk verschwendet, und
  2303. der Compiler kann sogar schneller darauf zugreifen.
  2304.  
  2305. Diese Datei, in der die Definitions-Codes zusammengefaßt sind, nennen  wir
  2306. Bibliotheks-Datei oder auch Library (das ist engl. und heißt in etwa das selbe).
  2307. Das Lesen der einzelnen Definitionen aus der Library ist für den Compiler sehr
  2308. einfach.  Demgegenüber  ist  es  aber  aufwendig,  ständig  neue  Dateien  darin
  2309. einzufügen  oder  auszutauschen.  Darum  bietet  es  sich  an,  nur  solche
  2310. Definitionen in die Library einzufügen, die keines ständigen Erneuerns bedürfen.
  2311. Die trifft vor allem auf die beim Megamax-System mitgelieferten MOS-Module
  2312. zu - die ändern höchstens wir, und das können wir dann gerade noch selbst
  2313. bewältigen.  Sie  selbst  können  also  auch  Definitions-Codes  hinzufügen,  nur
  2314. sollten Sie sich dieses Aspekts bewußt sein - wird die Definition verändert,
  2315. muß sie in der verwendeten Library aktualisiert werden, denn der Compiler
  2316. kann neu übersetzte Definitionen nicht automatisch in der Library ablegen, und
  2317. die Library hat immer  Vorrang  vor  den  Definitions-Codes  in  den  normalen
  2318. Verzeichnissen.
  2319.  
  2320. Die Definitions-Codes in die Library-Datei einzufügen, hat also zwei Vorteile:
  2321. Erstens sind sie darin hübsch  und  unauffällig  verpackt,  zweitens  kann  der
  2322. Compiler schneller darauf zugreifen, als dies bei den Einzeldateien möglich ist.
  2323. Natürlich müssen Sie nicht alle Ihre Definitions-Codes in die Library quetschen,
  2324. denn der Compiler kann  sie  selbstverständlich  auch  finden,  wenn  sie  ganz
  2325. normal  einzeln  in  den  Verzeichnissen  vorliegen:  Der  Compiler  sucht  beim
  2326. Importieren  zuerst  in  der  Library,  dann  in  der  DefPaths-Liste,  welche  im
  2327. Batch (meist MM2SHELL.M2B) bestimmt werden kann.
  2328.  
  2329. Mit dem Utility-Programm LibManager (ggf. erst übersetzen!) können Sie die
  2330. Library  bearbeiten.  Sie  können  sich  deren  Inhalt  ansehen  sowie  Dateien
  2331. einfügen, herauskopieren oder löschen. Das Programm  ist  menügeführt  und
  2332. daher (hoffentlich) selbsterklärend.
  2333. 2.4  Bedienung: Compiler                                                 2 - 51
  2334. ________________________________________________________
  2335.  
  2336.  
  2337. Eine weitere Optimierung besteht darin, die Definitionen zu komprimieren. Die
  2338. Codes in der mitgelieferten Library  MM2DEF.M2L  sind  bereits  komprimiert.
  2339. Dadurch ergibt sich eine Platzersparnis von ca. 55%. Der Compiler erkennt
  2340. beim Importieren automatisch, ob die Definitions-Codes komprimiert sind, und
  2341. expandiert sie dann selbstständig.
  2342.  
  2343. Jeder Definitions-Code kann komprimiert werden - der Compiler macht keinen
  2344. Unterschied, ob die Datei in der Library oder als Einzeldatei vorliegt.
  2345.  
  2346. Allerdings  hat  die  Kodierung  auch  einen  Nachteil:  Durch  das  notwendige
  2347. Expandieren dauert die Bearbeitung solcher Importe länger. Sind Sie stolzer
  2348. Besitzer  einer  Hard-Disk,  sollten  Sie  daher  die  Dateien  der  Library  alle
  2349. dekomprimieren, damit der Compiler damit keine unnötige Zeit mehr verbringen
  2350. muß.
  2351.  
  2352.  
  2353. Dekomprimieren der Dateien in der Library
  2354.  
  2355. Mit den Programmen Encode und Decode (UTILITY-Ordner) können die Dateien
  2356. (eigentlich jede beliebige Datei) gepackt und wieder entpackt  werden.  Beide
  2357. Programme sind sehr einfach anzuwenden: Beim Start wird nach einer Datei~
  2358. angabe gefragt. Geben Sie dann entweder die einzelne Datei  an  oder  ver~
  2359. wenden Sie Wildcards (z.B. D:üMM2üDEFü*.*), um mehrere Dateien in einem
  2360. Verzeichnis auf einmal anzusprechen. Wundern Sie sich nicht, daß das Kompri~
  2361. mieren relativ lange dauert - wir haben bisher  nur  die  Dekomprimierungs-
  2362. Algorithmen zeitlich optimiert, weil dies erstmal am wichtigsten war.
  2363.  
  2364. Wollen Sie nun die gepackte Library MM2DEF.M2L dekomprimieren, können Sie
  2365. nicht einfach die ganze Datei auf einmal entpacken. Statt dessen müssen Sie
  2366. erst mit dem LibManager alle Dateien herauskopieren, dann diese Einzeldateien
  2367. alle mit Decode dekomprimieren und am Ende alle Dateien wieder zu einer
  2368. neuen Library zusammenfügen (wiederum durch Verwendung von LibManager).
  2369.  
  2370.  
  2371. Protokoll
  2372.  
  2373. Ein Übersetzungsprotokoll kann bei der Suche nach Laufzeitfehlern oder auch
  2374. beim Verstehen eines fremden Programms nützlich sein, da es  neben  dem
  2375. Quelltext noch zusätzliche Angaben enthält.
  2376.  
  2377. Ein typisches Compilerprotokoll sieht z. B. so aus:
  2378.  
  2379. Megamax Modula Compiler 3.4h                            02-Nov-87   18:59
  2380.  
  2381.        1     0    D            MODULE Beispiel;
  2382.        2    0    D
  2383. 2.4  Bedienung: Compiler                                                 2 - 52
  2384. ________________________________________________________
  2385.  
  2386.  
  2387.        3    0    D            VAR     a: CARDINAL;
  2388.        4    0    D                      l: LONGCARD;
  2389.        5    0    D
  2390.        6    0    D            PROCEDURE square (c: CARDINAL): LONGCARD;
  2391.        7     1     D              BEGIN
  2392.        8    1     $00146           RETURN LONG (c) * LONG (c)
  2393.        9    1     $0015A        END square;
  2394.       10    0    D
  2395.       11     0    D            BEGIN
  2396.       12    0    $0016A        a := 55;
  2397.       13    0    $00174        l := square (a)
  2398.       14    0    $00180      END Beispiel.
  2399.  
  2400. Global variables:
  2401.                    $00002      l
  2402.                    $00000      a
  2403.  
  2404. Die erste Spalte enthält durchlaufende Zeilennummern für den Text. Dann folgt
  2405. ein Zähler für die Schachtelungstiefe von  Prozeduren  und  Modulen,  dessen
  2406. Nutzen Sie bei etwas komplizierteren  Programmen  als  dem  obigen  Beispiel
  2407. erkennen werden.
  2408.  
  2409. Die dritte Spalte gibt die Adresse des Zeilenanfangs im Codemodul an. Diese
  2410. Angabe ist immer relativ zum Modulanfang zu verstehen. Die gleiche relative
  2411. Adresse meldet Ihnen das System auch, wenn ein Laufzeitfehler auftritt - im
  2412. Protokoll können Sie so auf einen Blick die Fehlerzeile orten.  (Eine  andere
  2413. Möglichkeit der Fehlersuche bietet allerdings der Scanner - siehe Kapitel 2.5
  2414. 'Debugger'.) Wenn Deklarationszeilen übersetzt werden, erscheint statt einer
  2415. Adresse ein "D" im Protokoll.
  2416.  
  2417. Durch das Einfügen der zusätzlichen Spalten in das Protokoll passen die fol~
  2418. genden Zeilen des Programmtextes oft nicht mehr komplett auf eine Zeile von
  2419. 80 Zeichen. Der Compiler bricht dann im Protokoll den Rest der Zeile um.
  2420. Wenn Sie allerdings das Protokoll (z.B. auf einem Drucker) mit mehr als 80
  2421. Zeichen Breite ausgeben wollen, können Sie das Format im Parameter-Menü
  2422. auf andere Zeilenlängen einstellen.
  2423.  
  2424. Am Schluß der Protokolldatei folgt eine Liste der globalen Variablen mit den
  2425. jeweiligen relativen Adressen (die erste Variable liegt auf der rel. Adresse 0).
  2426.  
  2427. Die Startadressen der globalen Variablen und der Module können Sie durch
  2428. verschiedene  Funktionen  in  den  Modulen  Loader  und  ModCtrl  ermitteln
  2429. (Beispielprogramme in Ordnern DEMO & UTILITY: GPA, ModList und TraceMod).
  2430. In  der  Shell  werden  durch  Alternate-R  jedes  vorhandene  Modul  sowie  die
  2431. Startadressen und Längen des Codes angezeigt, ebenso wie mit ModList.
  2432. 2.5  Bedienung: Debugger                                                 2 - 53
  2433. ________________________________________________________
  2434.  
  2435.  
  2436. 2.5    Debugger
  2437.  
  2438. Megamax  Modula  unterstützt  Sie  bei  der  Fehlersuche  durch  spezielle
  2439. Debugging-Funktionen  (die  Übersetzung  "Entwanzen"  kennen  Sie  vermutlich
  2440. schon). Ein spezielles  Debugger-Programm  werden  Sie  allerdings  vergeblich
  2441. suchen - beim Suchen helfen Ihnen der Compiler persönlich und das Imple~
  2442. mentations-Modul Debug. Diese Debug-Funktionen ersparen Ihnen die übliche
  2443. Fehlersuche bei compilierten Sprachen durch Einfügen diverser Testausgaben in
  2444. den Programmtext; sie helfen auch beim Aufspüren vertrackter Probleme.
  2445.  
  2446. Für  "harmlosere"  Fälle  bietet  Megamax  Modula  eine  weitere  Hilfe  bei  der
  2447. Fehlersuche:  das  Auffinden  der  Programmstelle  im  Test,  an  der  ein
  2448. Laufzeitfehler  auftrat.  Diese  Scan-Funktion  ist  im  letzten  Abschnitt  dieses
  2449. Kapitels beschrieben.
  2450.  
  2451.  
  2452. Übersetzen im Debug-Modus
  2453.  
  2454. Wollen Sie ein Programm 'debuggen', fügen Sie bitte als erstes ein 'IMPORT
  2455. Debug' in die Importliste ein (falls das Programm im TOS-Modus läuft, also die
  2456. Endung MOS oder MTP hat, importieren Sie besser TOSDebug). Das Modul
  2457. Debug enthält die Laufzeitfunktionen, die bei der Fehlersuche benötigt werden,
  2458. und muß daher im RAM zur Verfügung stehen.
  2459.  
  2460. Mit der Compiler-Option (*$D+*) im Programmtext schalten Sie den Compiler
  2461. in  den  Debug-Modus  um.  Für  alle  Programmzeilen,  die  in  diesem  Modus
  2462. übersetzt werden, erzeugt der Compiler zusätzlichen Code, so daß diese Zeilen
  2463. schrittweise,  mit  Ausgabe   des   Programmtextes   und   der   berechneten
  2464. Ausdrücke, ausgeführt werden können.
  2465.  
  2466. Natürlich  braucht  dieser  zusätzliche  Code  auch  zusätzlichen  Platz  im
  2467. übersetzten Modul. Außerdem ist die Ausführung von Programmen im Debug-
  2468. Modus wesentlich langsamer als im Normalfall - das 'Debuggen' einer 5000
  2469. mal durchlaufenen Schleife beschert Ihnen nicht nur jede Menge Bildschirm~
  2470. ausgaben sondern auch eine ausgedehnte Kaffeepause.
  2471.  
  2472. Sie  sollten  daher  die  Möglichkeit  nutzen,  gezielt  einzelne  Programmteile
  2473. zwischen (*$D+*) und (*$D-*) einzuschließen und zu untersuchen. Oft ist es
  2474. sinnvoll,  zunächst  das  Hauptprogramm  zu  überprüfen  und  herauszufinden,
  2475. welche Prozedur fehlerhaft ist. In einem weiteren Compilerlauf kann dann diese
  2476. Prozedur im Debug-Modus übersetzt werden.
  2477. 2.5  Bedienung: Debugger                                                 2 - 54
  2478. ________________________________________________________
  2479.  
  2480.  
  2481. Ausführen im Debug-Modus
  2482.  
  2483. Ein  Programm,  das  im  Debug-Modus  übersetzt  wurde,  enthält  zusätzliche
  2484. TRAP-Anweisungen,  die  das  Modul  'Debug'  abfängt.  'Debug'  sorgt  für  die
  2485. Ausgabe  der  ausgeführten  Zeilen  und  berechneten  Ausdrücke;  zusätzlich
  2486. erlaubt das Modul die Beeinflussung der Ausführung über die Tastatur.
  2487.  
  2488. Die  normale  Anzeige  jeder  Programmzeile  besteht  aus  der  Textzeile  des
  2489. Programms; darunter werden alle in dieser Zeile berechneten arithmetischen
  2490. Ausdrücke ('Expressions' in der Syntaxbeschreibung) in der Reihenfolge ihrer
  2491. Berechnung  ausgegeben.  Die  Reihenfolge  dieser  Ausgaben  ist  nicht  immer
  2492. einfach zu überblicken und soll am folgenden Beispiel erläutert werden:
  2493.  
  2494. IF ORD(a) = b+c THEN d:=e; f:=h+(2*g)END;
  2495.  
  2496. Nach  dem  IF  steht  laut  Modula-Syntax  eine  'Boolean  Expression',  die
  2497. ausgegeben  wird.  Bei  der  Berechnung  dieses  Ausdrucks  wird  jedoch  eine
  2498. weitere 'Expression' ausgerechnet, nämlich das Argument der Funktion ORD -
  2499. dessen Wert erscheint also als erste Ausgabe. Der Wert b+c wird dagegen
  2500. nicht  angezeigt,  denn  links  und  rechts  vom  Gleichheitszeichen  stehen
  2501. syntaktisch nur Simple Expressions.
  2502.  
  2503. Die  im  THEN-Teil  berechneten  Ausdrücke  erscheinen  natürlich  nur,  wenn
  2504. dieser Zweig ausgeführt wird. Der erste Ausdruck ist der auf <d> zugewiesene
  2505. Wert, also <e>. Bei der Berechnung des Ausdrucks, der auf <f> zugewiesen
  2506. wird, ist wiederum ein zusätzlicher Ausdruck auszuwerten: In Klammern steht
  2507. laut Syntaxdiagramm wieder eine 'Expression'. Also wird erst der Wert <2*g>
  2508. ausgegeben, dann <h+2*g>.
  2509.  
  2510. Außer 'Expressions' werden noch die Werte von Variablen angezeigt, die als
  2511. Parameter an Prozeduren übergeben werden.
  2512.  
  2513. Allgemeiner Tip: Wenn mehr (oder weniger) Werte ausgegeben werden, als Sie
  2514. erwarten,  sehen  Sie  im  Syntaxdiagramm  nach,  wo  wirklich  'Expressions'
  2515. stehen. Um die Ausgabe eines Teilausdrucks zu erzwingen, ist es oft möglich,
  2516. ihn  in  Klammern  zu  setzen  -  innerhalb  der  Klammern  wird  wieder  eine
  2517. vollständige Expression erwartet und ausgegeben.
  2518. 2.5  Bedienung: Debugger                                                 2 - 55
  2519. ________________________________________________________
  2520.  
  2521.  
  2522. Leertaste   veranlaßt Ausführung und Ausgabe der nächsten Zeile
  2523.             oder schaltet von laufender Ausführung auf Einzelschritt.
  2524. <Return>    schaltet von Einzelschritt auf laufende Ausführung.
  2525. <H>         wählt Ausgabe von Skalaren als Hexadezimalzahlen.
  2526. <D>         wählt Ausgabe von Skalaren als Dezimalzahlen.
  2527. <S>         Eingabe einer Schrittweite: die eingegebene Anzahl Zeilen
  2528.             wird ohne Ausgaben (schneller) ausgeführt.
  2529. <A>         aktiviert die Ausgabe wieder, wenn sie durch <S>
  2530.             unterdrückt wurde.
  2531. <L>         schaltet zusätzliche Ausgabe der Zeilenadresse zu jeder
  2532.             Programmzeile ein/aus.
  2533. <R>         veranlaßt einmalige Ausgabe aller CPU-Register.
  2534.  
  2535. Die  gleichen  Kontrollfunktionen  können  statt  von  der  Tastatur  auch  vom
  2536. laufenden Programm aus umgeschaltet werden. Dazu können Steuervariablen
  2537. aus dem Modul 'Debug' importiert und verändert werden. Das erfordert zwar
  2538. einige zusätzliche Anweisungen im Programm, erleichtert aber manchmal die
  2539. gezielte  Fehlersuche  sehr  -  z.B.  wenn  die  Debug-Ausgaben  erst  aktiviert
  2540. werden  sollen,  wenn  eine  Variable  einen  bestimmten  Wert  hat  oder  eine
  2541. Prozedur mit vorgegebenen Argumenten aufgerufen wurde. Die Funktion der
  2542. Steuervariablen im einzelnen:
  2543.  
  2544. Continous:  BOOLEAN   =  "laufende Ausführung ohne Warten"
  2545. Active:     BOOLEAN   =  "folgende <Step> Schritte ohne Anzeige ausführen"
  2546. Step:       LONGCARD =   Anzahl der Schritte, die ohne Anzeige auszu~
  2547.                              führen sind (zusätzlich muß Active = FALSE sein)
  2548. LineAddr:   BOOLEAN   =  "zu jeder Programmzeile Adresse ausgeben"
  2549. Hex:        BOOLEAN   =  "Skalare als Hexadezimalzahlen ausgeben"
  2550.  
  2551.  
  2552. Der Scanner - Suchen der Fehlerposition
  2553.  
  2554. In vielen Fällen werden Sie das Debug-Modul zur Fehlersuche
  2555. aber gar nicht benötigen - es gibt noch eine einfache und oft
  2556. wesentlich  schnellere  Möglichkeit,  Programmierfehlern  auf  die
  2557. Spur zu kommen. Oft genügt es ja zu wissen, welche Stelle des Programms
  2558. (im  Text)  gerade  ausgeführt  wurde,  als  ein  Laufzeitfehler  auftrat.  Dabei
  2559. unterstützt Sie der 'Scanner', den Sie auf der Shell-Arbeitsfläche als Lupe
  2560. abgebildet sehen.
  2561.  
  2562. Hinter dem Scanner verbirgt sich in Wirklichkeit wiederum  der  Compiler  -
  2563. allerdings  in  einer  Betriebsart,  die  keine  Codedatei  erzeugt,  sondern  nur
  2564. so  lange  'ins  Blaue'  übersetzt,  bis  eine  bestimmte  Adresse  im  erzeugten
  2565. Codemodul erreicht ist. Dann stoppt der Scanner und ruft den Editor auf, um
  2566. die erreichte Textstelle zu zeigen.
  2567. 2.5  Bedienung: Debugger                                                 2 - 56
  2568. ________________________________________________________
  2569.  
  2570.  
  2571. Wenn  ein  Laufzeitfehler  auftritt,  ermittelt  das  Modula-System,  in  welchem
  2572. Modul und auf welcher relativen Adresse innerhalb des Moduls die Ausführung
  2573. unterbrochen wurde. Sie können wählen:
  2574.  
  2575. * Exit, um die angezeigte Fehlerposition im Programmtext zu suchen.
  2576. * Back, um statt der angezeigten Fehlerposition die Position des Aufrufers zu
  2577.   sehen (s.u.);
  2578. * Frwd, um entsprechend wieder die Position des nächsttieferen Aufrufs zu
  2579.   bekommen.
  2580.  
  2581. Nach Wahl von Exit haben Sie nochmals die Möglichkeit, durch Quit zur Shell
  2582. zurückzukehren oder durch Cont das Programm doch fortzusetzen. Durch Edit
  2583. schließlich starten Sie den Scanner, der Ihnen die gefundene Fehlerstelle dann
  2584. im Editor präsentiert.
  2585.  
  2586. Gelegentlich  müssen  Sie  noch  etwas  mehr  tun,  um  den  Ursprung  eines
  2587. Laufzeitfehlers zu finden: Unter  Umständen  ruft  das  fehlerhafte  Programm
  2588. eine Prozedur (evtl. in einem anderen Modul) mit falschen Parametern auf, und
  2589. erst dort wird der Fehler ausgelöst. Dann interessiert Sie natürlich nicht die
  2590. Position in der Prozedur, sondern die des falschen Aufrufs. In diesem  Fall
  2591. klicken Sie in der ScannerBox bitte nicht Exit, sondern Back an - eine neue
  2592. Scanner-Box  zeigt  Ihnen  Modulnamen  und  Adresse  des  Aufrufers.  Dieses
  2593. Rückverfolgen  zum  Aufrufer  können  Sie  wiederholen,  bis  das  'verdächtige'
  2594. Modul erreicht ist. Sind Sie in der Aufrufer-Kette zu weit 'geklettert', dann
  2595. können  Sie  mit  Frwd  wieder  tiefer  steigen.  Wenn  Sie  den  eigentlichen
  2596. Verursacher des Fehlers gefunden haben, wählen Sie Exit, und nach einem
  2597. Scannerlauf wird die Position in diesem Modul angezeigt.
  2598.  
  2599.  
  2600. Manuelles Starten des Scanners
  2601.  
  2602. Bei der oben beschriebenen Bedienung des Scanners ist das Scanner-Symbol
  2603. auf der Arbeitsfläche noch gar nicht benutzt worden. In zwei Fällen kommt
  2604. dieses Symbol zur Anwendung:
  2605.  
  2606. * Wenn Sie nach einem Laufzeitfehler eine Adresse aus der  Aufruferkette
  2607. ausgewählt haben (durch 'Back'/'Forward'), die sich nach dem Scannen nicht
  2608. als  der  eigentliche  Verursacher  des  Fehlers  herausstellt.  In  diesem  Fall
  2609. möchten  Sie  wahrscheinlich  noch  eine  andere  Adresse  aus  der  Kette
  2610. untersuchen.
  2611.  
  2612. * Wenn nach einem fatalen Laufzeitfehler die Shell und der  Scanner  nicht
  2613. mehr funktionieren (etwa nach Überschreiben wichtiger Speicherbereiche). Die
  2614. Fehlerposition im Code sollten Sie in jedem Fall noch erfahren; nach einem
  2615. Neustart  der  Shell  läßt  sich  die  zugeordnete  Textstelle  dann  durch  einen
  2616. manuellen Scanner-Aufruf (mit Eingabe der Adresse von Hand) feststellen.
  2617. 2.5  Bedienung: Debugger                                                 2 - 57
  2618. ________________________________________________________
  2619.  
  2620.  
  2621. Wollen Sie erneut die Aufrufkette zum vorangegangenen Laufzeitfehler sehen,
  2622. dann müssen Sie das Scanner-Symbol bei festgehaltener Shift-Taste anwählen
  2623. (z.B. mit Shift-S). Sie sehen dann die oben beschriebene Scanner-Box.
  2624.  
  2625. Übergeben Sie dagegen eine Datei an den Scanner, indem Sie sie auf das
  2626. Symbol schieben, so bekommen Sie die Möglichkeit, eine Fehleradresse  von
  2627. Hand einzugeben. Gemeint ist hier immer die relative Adresse innerhalb des
  2628. Moduls, wie sie auch nach Laufzeitfehlern angezeigt wird. Um die Arbeitsdatei
  2629. zu scannen, brauchen Sie das Scanner-Symbol nur doppelt anklicken.
  2630.  
  2631. Fragt der Scanner nach der relativen Position, ist der vorher beim Laufzeit~
  2632. fehler angezeigte Wert einzugeben. Dabei ist zu beachten, daß der Wert, wie
  2633. bei  der  Anzeige,  mitsamt  dem  "$"-Zeichen  eingegeben  wird,  da  dies  eine
  2634. Hexadezimalzahl kennzeichnet.
  2635. 2.5  Bedienung: Debugger                                                 2 - 58
  2636. ________________________________________________________
  2637.  
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.  
  2644.  
  2645.  
  2646.  
  2647.  
  2648.  
  2649.  
  2650.  
  2651.  
  2652.  
  2653.  
  2654.  
  2655.  
  2656.  
  2657.  
  2658.                                Auch diese Seite war zu kostbar,
  2659.                                      um leer zu bleiben.
  2660. 2.6  Bedienung: Linker                                                    2 - 59
  2661. ________________________________________________________
  2662.  
  2663.  
  2664. 2.6    Linker
  2665.  
  2666. Funktion
  2667.  
  2668. In Kapitel 1.4 haben wir schon beschrieben,  warum  das  Megamax  Modula-
  2669. System eigentlich ohne Linker auskommt: Der Loader als Teil der Entwicklungs~
  2670. umgebung sorgt für automatisches Load Time Linking, wenn Sie aus der Shell
  2671. ein Programm starten.
  2672.  
  2673. Wollen Sie  aber  ein  Modula-Programm  als  eigenständige  TOS-  oder  PRG-
  2674. Anwendung verwenden, dann muß es komplett mit allen benutzten Modulen in
  2675. einer  Codedatei  abgelegt  werden,  damit  das  TOS  damit  zurechtkommt.
  2676. Außerdem müssen noch einige zusätzliche Anweisungen eingefügt werden, um
  2677. für die Module die gleiche Laufzeitumgebung bereitzustellen, wie sie bei Aufruf
  2678. aus der Shell herrscht.
  2679.  
  2680. Eine solche Codedatei erzeugt der  Linker  -  erfreulicherweise  kann  er  das
  2681. vollautomatisch.  Sie  übergeben  ihm  nur  den  Namen  des  Hauptmoduls;  der
  2682. Linker lädt alle importierten Module dazu und fügt zusätzlich  ein  spezielles
  2683. Initialisierungs-Modul  ein.  Das  resultierende  Programm  kann  dann  völlig
  2684. unabhängig  vom  Modula-System,  z.B.  unter  dem  GEM-Desktop,  gestartet
  2685. werden;  daher  können  Sie  Programme  in  dieser  Form  auch  an  Dritte
  2686. weitergeben, die das Megamax Modula-System nicht besitzen  (siehe  Kapitel
  2687. 1.5).
  2688.  
  2689. Bedienung
  2690.  
  2691. Der Linker wird aufgerufen wie alle anderen Systemprogramme: Legen Sie mit
  2692. der Maus eine Code-Datei auf dem Linker-Symbol auf der Arbeitsfläche ab
  2693. (oder klicken Sie das Linker-Symbol an, um die Arbeitsdatei zu übergeben).
  2694. Bevor Sie den Linker starten, sollten Sie aber überprüfen, ob folgende Voraus~
  2695. setzungen erfüllt sind:
  2696.  
  2697. * Von allen Modulen, die in das Programm importiert werden, muß das über~
  2698. setzte Implementationsmodul vorhanden sein. Zusätzlich werden evtl. weitere
  2699. Module benötigt (siehe folgenden Abschnitt Konfigurationsmodule). Die Imple~
  2700. mentationsmodule werden auf den Pfaden der ImpPath-Liste (siehe Kap. 2.2,
  2701. Batch-Dateien) gesucht.
  2702.  
  2703. * Das fertig gelinkte Programm wird auf dem Pfad gespeichert, der für das
  2704. übergebene Hauptmodul angegeben wurde. (Sie können hier bewußt einen Pfad
  2705. -  durch  Doppelklick  auf  das  "aktuelle  Datei"-Fenster  oder  Control-P  -
  2706. angeben, auf dem das Hauptmodul gar nicht zu finden ist, um die Ausgabe zu
  2707. lenken;  das  Hauptmodul  wird  dann  auf  allen  Pfaden  der  ModPath-Liste
  2708. gesucht).  Auf  der  Zieldiskette  muß  genügend  Platz  sein  -  durch  die
  2709. zusätzlichen Module wird das  gelinkte  Programm  im  allgemeinen  wesentlich
  2710. größer als das ursprüngliche Modul.
  2711. 2.6  Bedienung: Linker                                                    2 - 60
  2712. ________________________________________________________
  2713.  
  2714.  
  2715. Wenn keine Schwierigkeiten auftreten, baut der Linker auf dem Bildschirm eine
  2716. Liste der importierten Module auf. Zuerst werden dabei stets die Konfigura~
  2717. tions-Module (s.u.) aufgenommen, gefolgt von ihren Importen. Dann folgen das
  2718. von Ihnen angegebene Hauptmodul und dessen Importe. Schließlich meldet der
  2719. Linker den erfolgreichen Ablauf und speichert das fertige Programm ab.
  2720.  
  2721. Fertig - mehr zu Bedienen gibt's in der Regel nicht! Es sei denn, Sie werden
  2722. mit einer der folgenden Fehlermeldungen konfrontiert:
  2723.  
  2724.  
  2725. Fehlermeldungen
  2726.  
  2727. Alle Meldungen beginnen mit der Angabe, welches Modul das Problem ausgelöst
  2728. hat  und  von  welchem  anderen  Modul  es  benötigt  wurde:  "Importing
  2729. <FehlerModul>  into  <KundenModul>".  Dann  folgt  eine  Fehlerbeschreibung.
  2730. Allgemein gilt: Der Linker interessiert sich immer für übersetzte Implemen~
  2731. tationsmodule - alle Probleme können sich also nur auf diese Dateien beziehen.
  2732.  
  2733. Module not found
  2734.     Das  übersetzte  Implementationsmodul  wurde  auf  keinem  der  Pfade
  2735.     gefunden, die in der IMPPATH-Pfadliste in der Shell-Info definiert sind.
  2736. Wrong module format
  2737.     Die  geladene  Datei  ist  kein  korrekt  aufgebautes  Implementationsmodul;
  2738.     vermutlich ist die Datei beschädigt.
  2739. Error in relocating list
  2740.     Die  Relozierliste  (Bestandteil  jedes  übersetzten  Moduls)  ist  fehlerhaft;
  2741.     vermutlich ist die Datei beschädigt.
  2742. Bad module layout
  2743.     Das  Modul  wurde  mit  einer  alten  Compilerversion  übersetzt,  die  ein
  2744.     anderes Dateiformat erzeugt. Modul neu übersetzen!
  2745. File is damaged
  2746.     Beim Laden des Moduls ist ein Lesefehler aufgetreten.
  2747. Wrong module version
  2748.     Die gefundene Version des Moduls paßt zu einem anderen Definitionsmodul
  2749.     als beim Übersetzen des Kundenmoduls vorlag. (Das Modul exportiert nicht
  2750.     genau die Bezeichner, die das Kundenmodul erwartet.) Ggf. beide Module
  2751.     neu übersetzen!
  2752. Out of memory
  2753.     Der Hauptspeicher reicht nicht aus.  Evtl.  vorhandene  Accessories  oder
  2754.     RAM-Disk entfernen.
  2755. Too many modules (list overflow)
  2756.     Mehr als die in den Parametern eingestellte Anzahl Module sollen gebunden
  2757.     werden. Erhöhen Sie den Wert Max. Module unter Parameter/Linker und
  2758.     wiederholen Sie den Linker-Aufruf.
  2759.  
  2760. Außerdem  sind  I/O  Error-Meldungen  möglich.  Sie  enthalten  jeweils  eine
  2761. Beschreibung des Fehlers und beziehen sich stets auf die Ausgabe-Datei.
  2762. 2.6  Bedienung: Linker                                                    2 - 61
  2763. ________________________________________________________
  2764.  
  2765.  
  2766. Linker-Optionen
  2767.  
  2768. Beim  Menüpunkt  Parameter
  2769. kann unter Linker eine Dia~
  2770. logbox geöffnet werden, die
  2771. das Einstellen aller Optionen
  2772. beim Linken zuläßt.
  2773.  
  2774. In den acht Treiber-Feldern
  2775. werden  die  Initialisierungs-
  2776. und    Konfigurations-Module
  2777. eingetragen, die weiter unten
  2778. ausführlich  behandelt  wer~
  2779. den.  Die  Stackgröße  wird
  2780. ebenfalls später erläutert. Der Wert hinter Max. Module bestimmt, wie viele
  2781. Module maximal  zu  linken  sein  werden.  Ist  dieser  Wert  zu  klein  gewählt,
  2782. meldet der Linker einen Fehler und Sie müssen den Wert erhöhen. Er sollte
  2783. aber auch nicht unnötig groß gewählt werden, weil je nach seiner Größe mehr
  2784. oder  weniger  Speicherplatz  von  vornherein  vom  Linker  reserviert  wird.
  2785. Besonders, wenn mangels Speicher öfter die Fehlermeldung Out of memory
  2786. beim Linken erscheint, sollten Sie diesen Wert so klein wie möglich halten.
  2787.  
  2788.  
  2789. Treiber- bzw. Konfigurations-Module
  2790.  
  2791. Zusätzlich zu den Modulen, die Sie explizit (durch IMPORT-Anweisungen) in
  2792. Ihren  Programmen  benutzen,  kann  der  Linker  noch  weitere  Module  in  die
  2793. Code-Datei einbinden. Mindestens ein solches Modul wird (fast) immer benötigt,
  2794. um vor dem Start des Modula-Programms die Laufzeitumgebung vorzubereiten.
  2795. Weitere  Module,  die  mitgeliefert  wurden,  stellen  Ausgabefunktionen  auf
  2796. unterster Ebene für TOS- oder GEM-Umgebung bereit.
  2797.  
  2798. Das System ist bereits so konfiguriert, daß alle Programme 'gelinkt' werden
  2799. können, ohne daß Sie sich um diese zusätzlichen Module kümmern müßten. Sie
  2800. können  die  Konfiguration  dieser  Module  aber  von  der  Shell  aus  mit  dem
  2801. Menüpunkt Parameter/Linker einstellen. In der Dialogbox (s.o.) existiert eine
  2802. Liste  für  mit  acht  Treibern.  Vor  jeden  dieser  Treiber  können  Sie  durch
  2803. Anklicken ein Häkchen setzen oder löschen - nur die so markierten Modul~
  2804. namen werden beim Linken eingebunden. Normalerweise  sind  fünf  der  acht
  2805. möglichen Namen eingetragen:
  2806.  
  2807. M2Init sorgt für die Vorbereitung der Laufzeitumgebung. Dieses Modul muß in
  2808. jedem Codefile enthalten sein - bitte nur 'abschalten', wenn es extra verlangt
  2809. wird, wie z.B. beim Linken von MoreMem (UTILITY-Ordner) oder wenn  Sie
  2810. selber die Initialisierung in Ihrem Modul vornehmen wollen.
  2811. 2.6  Bedienung: Linker                                                    2 - 62
  2812. ________________________________________________________
  2813.  
  2814.  
  2815. GEMError übernimmt die Behandlung von Laufzeitfehlern. Wenn dieses Modul
  2816. vorhanden ist, werden Laufzeitfehler in einer Alert-Box mit Fehlerbeschreibung
  2817. und -position angezeigt. GEMError kann nur sinnvoll bei keine Optimierung oder
  2818. verkürzende Optimierung mit eingelinkt werden. Wird vollständig optimiert, ist
  2819. statt dessen SimpleError einzubinden.
  2820.  
  2821. SimpleError ist eine einfachere Fehlerbehandlung als GEMError, die, falls über~
  2822. haupt ein Fehlerabfangen erwünscht ist, bei vollständig optimierten Programmen
  2823. gewählt werden muß.
  2824.  
  2825. Um Platz zu sparen, können Sie GEMError bzw. SimpleError auch weglassen -
  2826. dann erscheinen bei Laufzeitfehlern nur die allseits bekannten Bömbchen.
  2827.  
  2828. GEMIO enthält Ausgabefunktionen, auf die sich das InOut-Modul stützt. Diese
  2829. Funktionen lenken die Ausgabe auf ein Fenster, wie Sie es vom Arbeiten mit
  2830. der  Megamax  Modula-Shell  kennen.  Leider  ist  die  Unterstützung  dieser
  2831. 'hübschen' Ausgabe recht aufwendig, und die fertige Code-Datei wird relativ
  2832. lang.  Daher  können  Sie,  wenn  Ihr  Programm  sonst  keine  GEM-Funktionen
  2833. benutzt,  ohne  Programmänderung  wahlweise  auch  TOS-Ausgabe  über  das
  2834. TOSIO-Modul wählen:
  2835.  
  2836. TOSIO  enthält  die  gleichen  Ausgabefunktionen  wie  GEMIO,  allerdings  für
  2837. Ausgabe auf dem TOS-Bildschirm (schwarz auf komplett weißem Grund mit
  2838. Textcursor, keine GEM-Funktionen, keine Maus). Wenn Sie dieses Modul statt
  2839. GEMIO aktivieren, geben alle InOut-Funktionen auf dem TOS-Bildschirm aus.
  2840. Damit das GEM-Desktop die richtigen Initialisierungen beim Starten durchführt,
  2841. sollte das fertig gebundene Programm von '.PRG' in '.TOS' umbenannt oder von
  2842. vornherein  das  Modul  durch  die  Option  $E  MOS  im  Quelltext  als  TOS-
  2843. Programm klassifiziert werden.
  2844.  
  2845. Achtung: TOSIO verwendet die BIOS-Funktionen zur Bildschirm-Ein-/Ausgabe
  2846. und erlaubt somit keine Datei-Umleitung (I/O-Redirection) von außen, z.B. über
  2847. eine  Command-Shell.  Dafür  kann  solch  ein  Programm  nicht  einfach  durch
  2848. Eingabe von Control-C abgebrochen werden.
  2849.  
  2850. GEMDOSIO ist, ebenso wie TOSIO, für TOS- und TTP-Programme zuständig.
  2851. Es  erlaubt  die  Umlenkung  von  Ein-/Ausgaben  über  das  Modul  InOut  von
  2852. außerhalb  (beispielsweise  über  eine  Command-Shell)  und  den  Programm~
  2853. abbruch über Control-C, da die Ein-/Ausgaben über die GEMDOS-Funktionen
  2854. geschehen. Ist Ihnen der Sinn dieser Anwendung nicht klar, verwenden Sie
  2855. besser TOSIO!
  2856.  
  2857. Nochmal in Kurzform: Benutzen Sie M2Init immer; entweder GEMError oder
  2858. SimpleError  wenn  ordentliche  Fehlermeldungen  gewünscht  sind;  entweder
  2859. GEMIO,  TOSIO  oder  GEMDOSIO,  wenn  InOut-Funktionen  benutzt  werden.
  2860. (Falls das Programm InOut gar nicht benutzt, sollten diese IO-Module weg~
  2861. gelassen werden, um das Programm nicht unnötig zu vergrößern.)
  2862. 2.6  Bedienung: Linker                                                    2 - 63
  2863. ________________________________________________________
  2864.  
  2865.  
  2866. Komprimierung (Optimierung) des zu erzeugenden Programms
  2867.  
  2868. Durch die Wahl einer der vier gezeigten
  2869. Optionen läßt sich bestimmen, inwieweit
  2870. die   zusammengefügten   Module   im
  2871. erzeugten     Programm     komprimiert
  2872. werden sollen.
  2873.  
  2874. Die erste Einstellung keine Optimierung fügt die Module ohne Komprimierung
  2875. zusammen. Zudem werden die Informationen über alle Module mit eingebunden,
  2876. die  benötigt  werden,  wenn  das  Loadtime  Linking  vom  gelinkten  Programm
  2877. verwendet werden soll. Diese Option ist also zu wählen, wenn ein Programm
  2878. erzeugt wird, das den Loader importiert, um andere Module starten zu können,
  2879. z.B. bei der Shell dieses Systems (MM2Shell).
  2880.  
  2881. Alternativ  zu  keiner  Optimierung  können  auch  nur  Prozedurnamen  entfernt
  2882. werden.  Dadurch  bleiben  die  Module  vollständig  erhalten,  nur  werden  die
  2883. Symboltabellen, die die einzelnen Prozedurnamen enthalten, entfernt. Loadtime
  2884. Linking ist dann weiterhin möglich, nur ist das Scanning (s. Kap 2.5, Debugger)
  2885. und die Anzeige der Prozedurnamen bei Laufzeitfehlern nicht mehr möglich.
  2886. Diese Komprimierung ist  für  Sie  meist  nicht  von  Interesse.  Lediglich  beim
  2887. Linken der Shell (sofern Sie daran Änderungen vorgenommen haben) sollten
  2888. Sie sie anstatt keiner Optimierung anwenden,  weil  Sie  dabei  ca.  10  KByte
  2889. einsparen.  Da  Sie  im  Allgemeinen  bei  Fehlern  in  den  MOS-Modulen  keine
  2890. Korrekturen vornehmen können, können Sie bei diesen Modulen ja ruhig auf die
  2891. Möglichkeit zum Scanning verzichten. Auf Module, die per Loadtime Link von
  2892. der Shell gestartet werden, hat dies keinen Einfluß.
  2893.  
  2894. Die  Option  Prozedurnamen  erhalten  erzeugt  kompaktere  Programme.  Dabei
  2895. werden alle Funktionen entfernt, auf die es keine Referenz zur Laufzeit gibt.
  2896. Das  gelinkte  Programm  enthält  demnach  nur  Module  mit  Funktionen,  die
  2897. aufgerufen werden können und Module mit exportierten Variablen, die von den
  2898. benötigten Prozeduren benutzt werden. Zusätzlich enthalten sind, wie bei den
  2899. vorigen Optionen,die Informationen über die Module, die für eine Laufzeitfehler~
  2900. analyse  (Anzeige  der  Prozedur-  und  Modulnamen  und  der  aufrufenden
  2901. Prozeduren) mittels des Moduls GEMError benötigt werden. In dieser Form ist
  2902. kein Load-Time-Linking vom gelinkten Programm aus möglich.
  2903.  
  2904. Wenn weder vom Loadtime Linking (Starten von Modulen mittels des Loaders),
  2905. noch von der komfortablen  Fehleranalyse  (Import  von  GEMError)  Gebrauch
  2906. gemacht  werden  soll,  kann  die  letzte  Einstellung  vollständige  Optimierung
  2907. gewählt  werden.  Sie  erzeugt  die  kompaktesten  Programme,  indem  im
  2908. Unterschied  zur  vorigen  Option  die  Informationen  zur  Fehleranalyse  weg~
  2909. gelassen  werden.  Damit  eventuelle  Fehler  trotzdem  ordentlich  angezeigt
  2910. werden, muß SimpleError statt GEMError eingebunden werden.
  2911. 2.6  Bedienung: Linker                                                    2 - 64
  2912. ________________________________________________________
  2913.  
  2914.  
  2915. Vorsicht:
  2916.  
  2917. Bei der vollständigen Optimierung entfernt der Linker alle Module vollständig,
  2918. die zwar importiert werden, aus denen aber keine Prozeduren oder Variablen
  2919. wirklich benutzt werden. Das heißt: Importieren Sie ein Modul, das in seinem
  2920. Initialisierungscode (Körper) lediglich Variablen anderer Module initialisiert oder
  2921. importierte Prozeduren dort aufruft, verschwinden diese Anweisungen!
  2922.  
  2923. Dieser  Effekt  tritt  nur  beim  optimierten  Linken  auf.  Haben  Sie  also  ein
  2924. Programm, das ungelinkt unter der Shell oder nicht-optimiert gelinkt fehlerfrei
  2925. läuft, optimiert gelinkt aber nicht funktioniert, prüfen Sie, ob die beschriebene
  2926. Situation bei Ihnen vorkommt. Sie können es auch daran erkennen, daß solche
  2927. Module beim Linken zwar erst beim  Einladen  angezeigt  werden,  dann  aber
  2928. wieder vom Bildschirm gelöscht werden, weil sie vollständig entfernt wurden.
  2929.  
  2930. Um  dies  zu  verhindern,  müssen  Sie  die  wegoptimierten  Module  mit  der
  2931. Direktive B+ übersetzen, entweder durch $B+ im Quelltext oder durch -B in
  2932. der Eingabezeile für Direktiven in der Compiler-Parameter-Box.
  2933.  
  2934. Zusammenfassend seien pauschal diese Regeln zu befolgen:
  2935.  
  2936. * Accessories sollten möglichst kurz sein und dürfen nie mit einem Fehler
  2937. abbrechen,  da  dann  das  gesamte  System  nicht  mehr  funktionsfähig  ist.
  2938. Deshalb ist am besten nach eingehendem Testen das Modul mit der Option
  2939. $R-  zu  compilieren,  um  Platz  zu  sparen,  und  das  Programm  dann  mit
  2940. vollständiger Optimierung und  ohne  Fehlermodule  zu  linken  (also  in  Linker-
  2941. Optionen nur M2Init aktivieren).
  2942.  
  2943. * Die Shell MM2Shell wird mit der Einstellung keine Optimierung  oder  nur
  2944. Prozedurnamen  entfernen  und  den  Modulen  M2Init,  GEMIO  und  GEMError
  2945. gebunden. Max. Module sollte den Wert 100 haben. Falls der Linker nicht linken
  2946. will,  weil  der  freie  Speicher  nicht  ausreicht,  entfernen  Sie  die  resident
  2947. geladenen  Programme  (z.B.  Compiler  und  Editor).  Wenn  das  nicht  reicht,
  2948. entfernen Sie Ihre Accessories, residente Programme im AUTO-Ordner und
  2949. ggf. auch eine vorhandene RAM-Disk (dann müssen die Suchpfade ImpPath und
  2950. ModPath  ggf.  die  Pfadnamen  für  die  IMP-  und  MOD-Dateien  auf  den
  2951. Laufwerken A: oder B: enthalten, damit die Modulcodes dann von Disk geladen
  2952. werden können).
  2953.  
  2954. * Sonstige Programme können in der Regel mit der vollständigen Optimierung
  2955. gelinkt werden, um zu erreichen, daß die Programme möglichst wenig Platz auf
  2956. Disk und im Speicher beim Ausführen belegen. Zur Sicherheit sollte allerdings
  2957. das Modul SimpleError mit eingebunden werden, damit in einem unerwarteten
  2958. Fehlerfall das Programm sich nicht gleich mit Bömbchen verabschiedet, sondern
  2959. statt dessen eine Meldung zeigt, um was für einen Fehler es sich handelt. Ist
  2960. allerdings  mit  Laufzeitfehlern  zu  rechnen,  ist  es  sinnvoller,  verkürzende
  2961. Optimierung zu wählen und GEMError einzubinden. Dann ist bei einem Fehler
  2962. 2.6  Bedienung: Linker                                                    2 - 65
  2963. ________________________________________________________
  2964.  
  2965.  
  2966. die  Lokalisation  der  Ursache  einfacher.  Da  aber  in  diesem  Fall  meist  nur
  2967. Prozedurnamen, aber kein 'Offset' zum nachträglichen Scannen in der Shell
  2968. angezeigt werden kann, ist im ungünstigsten Fall keine Optimierung zu wählen.
  2969. Dann werden auch die Offsets bei Fehlern immer angezeigt. In der Shell kann
  2970. dann z.B. durch Ziehen des Quelltextes des zu scannenden Moduls auf die
  2971. Scan-Box der Offset eingegeben werden, um den Scanner zu aktivieren.
  2972.  
  2973. * Bei allen normalen Programmen, auch Accessories, muß M2Init als erstes
  2974. Treibermodul  eingebunden  werden,  weil  dieses  Modul  dafür  sorgt,  den
  2975. überflüssigen Speicher freizugeben, die globalen Variablen (das BSS Segment)
  2976. zu löschen und die einzelnen Module zu initialisieren (die Modulkörper werden
  2977. alle nacheinander aufgerufen).
  2978.  
  2979. *  Es  ist  immer  darauf  zu  achten,  daß  die  Module  GEMIO,  TOSIO  oder
  2980. GEMDOSIO nur dann eingebunden zu werden brauchen, wenn das Modul InOut
  2981. verwendet wird. Ansonsten erzeugt das Einbinden dieser Module nur unnötig
  2982. lange Programme.
  2983.  
  2984.  
  2985. Stack-Größe
  2986.  
  2987. Ebenso wie bei Modulen, die unter der Shell mit Loadtime-Linking gestartet
  2988. werden, kann die Stackgröße auch für gelinkte Programme bestimmt werden
  2989. (siehe auch Kap. 2.2, Kommandozeile). Ist der Wert Null eingetragen, wird die
  2990. Standard-Größe verwendet, die in M2Init bestimmt ist (normalerweise  8192
  2991. Bytes). War beim Starten eines Moduls unter der Shell ein größerer Stack
  2992. nötig, so ist dieser in der Regel genauso beim Linken in der Linker-Parameter-
  2993. Box einzustellen. Ist der Stack des gelinkten Programms zu klein, wird eine
  2994. entsprechende Fehlermeldung während des  Programmlaufs  angezeigt,  sofern
  2995. GEMError bzw. SimpleError mit eingebunden wurde.
  2996.  
  2997.  
  2998. Binden von Accessory-Programmen
  2999.  
  3000. Übrigens: Accessories (Endung ACC) können ohne weiteres mit dem Linker
  3001. erzeugt werden, ihre Endung muß nur ggf. auf ACC angepaßt werden, wenn
  3002. nicht schon im Programmtext mit einer Zeile wie (*$E MAC *) die Endung für
  3003. den Linker vorbereitet wird. Mit Hilfe der Funktion PrgCtrl.Accessory kann das
  3004. Programm gar abfragen, ob es nun  als  normales  PRG-Programm  oder  als
  3005. Accessory  mit  Endung  ACC  gestartet  wurde,  und  entsprechend  reagieren
  3006. (Accessories müssen sich zusätzlich in die Menüleiste eintragen und dürfen
  3007. nicht terminieren!).
  3008. 2.6  Bedienung: Linker                                                    2 - 66
  3009. ________________________________________________________
  3010.  
  3011.  
  3012. Fast Load-, Fast Code- und Fast Memory-Flags
  3013.  
  3014. In neueren TOS-Versionen werden drei neue Kennungen im Programmkopf von
  3015. gelinkten  Programmen  ausgewertet.  Das  Fast  Load-Flag  (seit  TOS  1.4)
  3016. bestimmt, ob ein Programm es nötig hat, daß beim Start seine TPA gelöscht,
  3017. also mit Null-Bytes beschrieben werden soll. Die  TPA  ist  der  größte  freie
  3018. Speicherblock, in dem das Programm selbst auch steht. Sie ist Bestandteil des
  3019. Heaps; dem Speicher, der mit dem Storage-Modul angefordert werden kann.
  3020. Ist das Flag gesetzt, wird die TPA  nicht  gelöscht.  Modula-Programme,  die
  3021. unter der Shell vom Loader gestartet werden, erhalten den Heap nie gelöscht,
  3022. so brauchen Sie es in der Regel auch nicht, wenn sie gelinkt gestartet werden.
  3023. Daher kann das Fast Load-Flag immer aktiviert bleiben.
  3024.  
  3025. Die Flags für Fast Code und Fast Memory bestimmen bei Atari TT-Rechnern,
  3026. ob  der  "schnelle"  Speicher  dieses  Computers  mitbenutzt  werden  darf.
  3027. Einschränkungen  gibt  es  hier  nur  selten,  beispielsweise,  wenn  Sie  die
  3028. Videospeicher-Adresse in einen anderen Bereich legen wollen, denn dies darf
  3029. nur im "normalen" Speicher der ersten 16 MByte geschehen - das Fast RAM
  3030. liegt aber oberhalb der ersten 16 MB.
  3031.  
  3032. Fast Code bestimmt, ob der Programmcode im schnellen Speicher  ablaufen
  3033. darf,  Fast  Memory,  ob  bei  Speicheranforderungen  (vom  Heap)  auch  der
  3034. schnelle Speicher vergeben werden darf. Funktioniert ein Programm nicht auf
  3035. dem TT, sollten Sie zuerst diese Flags probeweise abschalten.
  3036.  
  3037.  
  3038. Arbeitsweise des Linkers
  3039.  
  3040.   Bekanntermaßen wird der Linker dazu verwendet, um aus einem Hauptpro~
  3041. gramm und seinen Bibliotheken ein Programm zu erzeugen, das auch außerhalb
  3042. der Megamax-Shell ausführbar ist.
  3043.  
  3044.   Die Mindestanforderung an den Linker ist dabei, das Hauptmodul mit allen
  3045. importierten  Modulen  zusammenzufügen  und  die  Adressen  der  "externen"
  3046. Prozeduren und Variablen zu verketten. Außerdem müssen die Relozierinfor~
  3047. mationen  der  einzelnen  Module  vom  für  das  Loader-Modul  verständlichen
  3048. Format in das TOS-Format umgewandelt werden. Dann kann daraus eine Datei
  3049. erzeugt werden, in der am Anfang noch Informationen abgelegt werden, wie
  3050. lang der Programm- und der Variablenbereich sind und wo im Programmcode
  3051. der Körper des Hauptmoduls liegt, also des Teils, in dem mit der Ausführung
  3052. begonnen werden soll.
  3053.  
  3054.   Nur reicht das in der Regel nicht aus, denn so wird zwar das Hauptmodul
  3055. beim Starten des gelinkten Programms ausgeführt, aber die ihm untergeordne~
  3056. ten Module wurden nicht initialisiert. Es ist notwendig, zusätzlich die Körper
  3057. der anderen Module vorher auszuführen. Aus diesem Grund legt der Linker
  3058. 2.6  Bedienung: Linker                                                    2 - 67
  3059. ________________________________________________________
  3060.  
  3061.  
  3062. zwischen dem  Programmcode  und  der  Reloziertabelle  noch  eine  Liste  aller
  3063. Adressen der Körper ab, und zwar in ihrer hierarchischen Reihenfolge, mit
  3064. dem tiefsten Modul beginnend. Damit diese Körper nun ausgeführt werden, muß
  3065. ein weiteres Modul eingebunden werden; wir empfehlen M2Init.
  3066.  
  3067.   M2Init, dessen Körper als erstes Modul ausgeführt wird, weil es vom Linker
  3068. als Hauptmodul verstanden wird, sorgt außerdem für richtige Initialisierung des
  3069. Programms. Zuerst ermittelt es, ob es  als  Accessory  gestartet  wurde;  in
  3070. diesem Fall fordert es erst einmal Speicher an, um ihn als Stack verwenden
  3071. zu können. Im anderen Fall hat es bereits den gesamten freien Speicher als
  3072. Stackbereich erhalten und verkleinert ihn deshalb erstmal und gibt den unbe~
  3073. nutzten Bereich an das System zurück.
  3074.  
  3075.   Der Linker hat dafür gesorgt, daß in dem Adreßregister A0 die Adresse der
  3076. Base-Page und in A1 die Adresse der Liste mit den Verweisen auf die Körper
  3077. der anderen Module übergeben werden. So ruft M2Init dann alle von ihm selbst
  3078. importierten Modulkörper auf (sie stehen zu Beginn der Liste, die mit einem
  3079. NIL-Zeiger abschließt) und dann eine Prozedur aus dem Modul MOSCtrl, um
  3080. ihr die Adresse einer Tabelle mitzuteilen, welche ebenfalls vom Linker erzeugt
  3081. wurde, und in welcher, sofern nicht vollständige Optimierung gewählt wurde,
  3082. die Informationen über alle vorhandenen Module enthalten sind (z.B. Modulname,
  3083. Adresse und Länge im Speicher, usw.). Diese Tabelle wird vom Modul ModBase
  3084. verwaltet und von ModCtrl und Loader mitverwendet. Sie wird z.B. benötigt,
  3085. um bei einer Fehleranzeige durch GEMError den Modulnamen  und  ggf.  den
  3086. Prozedurnamen zu ermitteln.
  3087.  
  3088.   Ist die Initialisierung des MOS-Systems abgeschlossen, werden die restlichen
  3089. Modulkörper  ausgeführt  (die  Liste  wird  fortgesetzt  und  wiederum  mit  NIL
  3090. abgeschlossen), wobei der letzte Körper das eigentliche Hauptmodul ist.
  3091.  
  3092.   Nun ist es theoretisch unnötig, immer die importierten  Module  vollständig
  3093. einzubinden, da normalerweise nicht alle Prozeduren (zumindest bei den mitge~
  3094. lieferten Bibliotheksmodulen) verwendet werden. Deshalb gibt es die Möglich~
  3095. keit, die Programme optimiert  zu  linken.  Beim  Megamax  Modula-2  gibt  es
  3096. zwei Stufen der Optimierung. Beide haben gemeinsam, daß alle Prozeduren, die
  3097. keinesfalls  benötigt  werden,  vor  dem  Zusammenbinden  aus  den  Modulen
  3098. entfernt werden. Ergibt sich dabei, daß trotz Import-Anweisung eines Moduls
  3099. aus diesem weder Prozeduren noch Variablen verwendet werden, wird sogar
  3100. das gesamte Modul nicht eingebunden (dies ist daran zu erkennen, daß solche
  3101. Modulnamen im Fenster nach dem Optimiervorgang wieder verschwinden). Dies
  3102. ist u.a. bei Modulen der Fall, die nur Konstanten enthalten (z.B. MOSGlobals).
  3103.  
  3104.   Soll ein Modul nicht komplett wegoptimiert werden können, obwohl es keine
  3105. Funktionen und Variablen exportiert, aber beispielsweise in seinem Modulkörper
  3106. Variablen, die es aus anderen Modulen importiert hat, initialisiert oder auch
  3107. dort importierte Funktionen aufruft, muß in seinem Quelltext - am besten zu
  3108. Beginn - die Compiler-Option $B+ aufgeführt werden!
  3109. 2.6  Bedienung: Linker                                                    2 - 68
  3110. ________________________________________________________
  3111.  
  3112.  
  3113.   Ob eine Prozedur benötigt wird, erkennt der Linker daran, daß er nachsieht
  3114. - ausgehend von jedem Modulkörper - welche Prozeduraufrufe darin vorkom~
  3115. men.  Diese  gefundenen  Prozeduren  werden  nun  wiederum  selbst  alle  auf
  3116. weitere Aufrufe überprüft (eine an sich ganz einfache Sache). Es werden dabei
  3117. auch Prozeduren ermittelt, die zwar als Aufrufe von aufgerufenen Prozeduren
  3118. gefunden werden, jedoch nie ausgeführt werden, weil eine damit verbundene
  3119. Bedingung niemals eintritt - aber dies kann der Linker nicht herausfinden und
  3120. optimiert sie deshalb nicht weg.
  3121.  
  3122.   Alle Prozeduren, die auf diesem Wege nicht gefunden wurden, werden als
  3123. nicht benötigt deklariert und somit beim  Binden  aus  den  Modulen  entfernt.
  3124. Lokale  Prozeduren  werden  übrigens  immer  zusammen  mit  ihren  globalen
  3125. Vätern behandelt. Es kann nicht erkannt werden, daß lokale Prozeduren nicht
  3126. benötigt werden. Es wird nur auf die globalen Rücksicht genommen und die
  3127. lokalen müssen mitziehen (informatisches Machtgefüge). Prozeduren, die auf
  3128. dem äußersten Scope von lokalen Modulen ihren Platz haben, werden natürlich
  3129. wie  globale  Prozeduren  behandelt.  Bitte  erwarten  Sie  aber  nicht,  daß  die
  3130. lokalen  Modulkörper  auch  entfernt  werden,  wenn  das  globale  Modul  keine
  3131. Variablen oder Prozeduren aus dem lokalen Modul verwendet!
  3132.  
  3133.   Die  beiden  Optimierungsmodi  unterscheiden  sich  nur  darin,  daß  beim
  3134. "vollständigen Optimieren" auch  die  Informationen  über  die  Module  für  das
  3135. Modul  ModBase  und  die  Prozedurnamen  entfernt  werden,  wohingegen  beim
  3136. anderen Modus diese Daten erhalten bleiben, um dem Modul  GEMError  die
  3137. gewohnte Ausführlichkeit bei der Anzeige von Laufzeitfehlern zu bieten.
  3138. 2.7  Bedienung: Make und ModRef                                        2 - 69
  3139. ________________________________________________________
  3140.  
  3141.  
  3142. 2.7    Make  und   ModRef
  3143.  
  3144.  
  3145. Prinzip eines Make
  3146.  
  3147. Das Make ist ein Hilfsprogramm, das nicht unbedingt zur Programmentwicklung
  3148. benötigt wird, das aber bei umfangreicheren Programmprojekten sehr hilfreich
  3149. ist.
  3150.  
  3151. Arbeiten Sie an einem Programm, das aus  mehreren  Modulen  besteht,  die
  3152. häufig geändert werden, müssen Sie ja immer darauf achten, diese Änderungen
  3153. vor einem neuen Programmstart zu übersetzen. Bei gleichzeitigen Änderungen
  3154. in  mehreren  Modulen  kann  es  vorkommen,  daß  Sie  dann  ein  Modul  zu
  3155. übersetzen vergessen. Bei Definitionsänderungen erhalten Sie dann meistens
  3156. eine Fehlermeldung vom Loader (welchen die Shell  dann  anzeigt)  oder  vom
  3157. Linker, daß  ein  Versionskonflikt  zwischen  den  Modulen  vorliegt.  Im  ungün~
  3158. stigeren Fall wird nichts bemerkt und beim Start des Programms machen sich
  3159. dann  die  vermeintlichen  Änderungen  nicht  bemerkbar,  was  zu  großer
  3160. Verwirrung führen kann.
  3161.  
  3162. In diesem Fällen ist es also notwendig, alle betroffenen Module neu zu über~
  3163. setzen. Weiß man nicht, welche das sind, ist das dann sehr zeitaufwendig. Ein
  3164. Make versucht nun, anhand bestimmter Anhaltspunkte selbst herauszufinden,
  3165. welche Module nach erfolgten Änderungen neu zu übersetzen sind. Hierzu gibt
  3166. es  verschiedene  Verfahren.  So  könnte  beispielsweise  der  Editor  jedes
  3167. geänderte Modul irgendwie markieren, indem es seinen Namen in eine Datei
  3168. schreibt. Dann könnte das Make diese Module alle compilieren lassen. Da das
  3169. Megamax-System  aber  jeden  beliebigen  Editor  zur  Programmentwicklung
  3170. zulassen soll, würde dies Verfahren nicht helfen, weil kein Fremdeditor solch
  3171. eine Markierung vornehmen würde.
  3172.  
  3173.  
  3174. Arbeitsweise von Make
  3175.  
  3176. Die  einzige  Markierung,  die  jeder  Editor  automatisch  nach  einer  Änderung
  3177. vornimmt,  liegt  darin,  daß  beim  Abspeichern  jedes  geänderten  Textes  das
  3178. Betriebssystem (GEMDOS) die aktuelle Tageszeit und das Datum der Datei mit
  3179. im Inhaltsverzeichnis speichert. So kann jedem Text angesehen werden, wann
  3180. er zuletzt - wahrscheinlich  nach  einer  Änderung  -  gespeichert  wurde.  Da
  3181. ebenso die vom Compiler übersetzten Code-Dateien beim Abspeichern mit der
  3182. aktuellen Zeit vermerkt werden, kann das Make durch Vergleich der Zeiten
  3183. von Text- und Code-Datei entscheiden, welche Datei jünger ist: Ist ein Text
  3184. jünger,  muß  er  compiliert  werden,  wurde  er  daraufhin  übersetzt,  ist  der
  3185. resultierende Code jünger, woraufhin das Make beim wiederholten Start nun
  3186. alles als aktualisiert erkennt.
  3187. 2.7  Bedienung: Make und ModRef                                        2 - 70
  3188. ________________________________________________________
  3189.  
  3190.  
  3191. Darin liegt also das prinzipielle Vorgehen beim Megamax-Make. Voraussetzung
  3192. ist selbstverständlich, daß Datum und Zeit immer stimmen, damit  ein  nach
  3193. einer Übersetzung veränderter Text auch wirklich eine spätere Zeit als die
  3194. seines Codes erhält. Besitzen Sie einen Mega-ST, brauchen Sie sich  keine
  3195. Sorgen  darum  zu  machen,  weil  diese  Rechner  eine  Batterie-gepufferte
  3196. Echtzeituhr enthalten, die auch beim Ausschalten des Computers weiterläuft
  3197. (vorausgesetzt,  Sie  haben  auch  eine  geladene  Batterie  eingesetzt).  Den
  3198. Besitzern von anderen ST-Computern bieten sich mehrere Lösungen: Auch für
  3199. diese Rechner gibt es einsteckbare, nicht-flüchtige Echtzeituhren zu kaufen.
  3200. Verfügen Sie nicht über so einen Zusatz, müssen Sie die Zeit nach jedem
  3201. Rechnerstart  (auch  beim  Druck  auf  den  RESET-Taster)  neu  stellen.  Dazu
  3202. können  Sie  beispielsweise  das  bei  Ihrem  Atari  mitgelieferte  Accessory
  3203. CONTROL.ACC  verwenden.  Ebensogut  können  Sie  auch  aus  dem  UTILITY-
  3204. Ordner das Programm Timer (Dateiname: TIMER.M) compilieren, linken und als
  3205. Accessory mit der Endung ACC auf ihre Boot-Disk kopieren.
  3206.  
  3207. Am komfortabelsten für Anwender ohne Echtzeituhr ist  es,  das  Programm
  3208. SetTime aus dem UTILITY-Ordner zu verwenden: Es muß übersetzt und gelinkt
  3209. und dann in den AUTO-Ordner kopiert werden. Schalten Sie den Rechner neu
  3210. ein, erkennt das Programm, daß noch keine gültige Zeit eingestellt ist  und
  3211. fordert Sie dazu auf. Wenn Sie dann später den Rechner neu booten, ohne ihn
  3212. auszuschalten  (z.B.  durch  Druck  auf  den  RESET-Taster),  überträgt  das
  3213. Programm die im Tastatur-Chip des Atari gespeicherte Zeit (die erst beim
  3214. Ausschalten des Atari verloren geht) automatisch an das GEMDOS, welches
  3215. für die Zeit der Dateien zuständig ist, eine erneute Eingabe bleibt Ihnen damit
  3216. erspart.
  3217.  
  3218. Das Verfahren des Zeitvergleichs bei den Dateien ist allerdings nicht optimal:
  3219. Es kann ja auch vorkommen, daß in einem Modultext nur Änderungen an der
  3220. Dokumentation vorgenommen werden, so daß keine Neuübersetzung notwendig
  3221. wäre. Das ist eben ein kleiner Seiteneffekt, der wohl auch von Ihnen akzeptiert
  3222. werden kann, oder? Nebenbei: Achten Sie auf die Dokumentationen  zu  den
  3223. mitgelieferten Editoren. So bietet Ihnen beispielsweise der Gepard-Editor die
  3224. Möglichkeit, den Text mit "K" zu speichern. Dann wird die vorige Zeit der
  3225. Datei beibehalten, so daß Make nicht darauf anspricht.
  3226.  
  3227. Nun ist das Problem der Markierung von Änderungen an den Modulen gelöst.
  3228. Aber es gibt noch  ein  weiteres:  Ändern  Sie  ein  Definitionsmodul,  das  von
  3229. weiteren  Modulen  importiert  wird,  an  denen  Sie  aber  keine  Änderungen
  3230. vornehmen, müssen diese trotzdem übersetzt werden. Damit das Make dies
  3231. erkennen  kann,  muß  es  über  die  augenblicklichen  Import-Verhältnisse  der
  3232. beteiligten Module informiert sein. Es bietet sich an, ausgehend vom Haupt~
  3233. modul des Programms, alle importierten Module zu beschreiben, wiederum mit
  3234. deren Importen usw. Diese Beschreibung erfolgt in einer Datei, die dann vom
  3235. Make ausgewertet wird:
  3236. 2.7  Bedienung: Make und ModRef                                        2 - 71
  3237. ________________________________________________________
  3238.  
  3239.  
  3240. Das Make sieht sich zuerst die Definitionstexte in der Reihenfolge an, in der
  3241. sie importiert werden: Die Module, die selbst keine mehr importieren zuerst,
  3242. die, die von keinem  anderen  importiert  werden  zuletzt.  Ist  dabei  ein  Text
  3243. jünger als sein Code, oder existiert der Code gar noch nicht, wird es zur
  3244. Übersetzung markiert. Alle Definitionen, die ein markiertes Modul importieren,
  3245. werden  ebenfalls  markiert.  Dann  wird  ebenso  bei  den  Implementationen
  3246. verfahren: Ist die eigene Definition oder die eines Imports markiert oder ist
  3247. der Text jünger als der Code, bzw. fehlt der Code, wird es auch markiert.
  3248. Zuletzt werden alle markierten Module in eine Textdatei geschrieben und das
  3249. Make sorgt dafür, daß die Module vom Compiler übersetzt werden.
  3250.  
  3251.  
  3252. Erstellung einer Make-Datei (ModRef)
  3253.  
  3254. In der Make-Datei wird  das  Hauptmodul  mitsamt  aller  importierter  Module
  3255. beschrieben. Um solch eine Datei zu erzeugen, kann das Programm ModRef
  3256. verwendet werden. Am besten melden Sie ModRef als Tool an (siehe Kap. 2.2,
  3257. Batch-Dateien).
  3258.  
  3259. Wird ModRef ausgeführt, zeigt es den GEM-Datei-Selektor, mit dem dann ein
  3260. Hauptmodul (üblicherweise Dateien mit der Endung "M") ausgewählt  werden
  3261. kann.  Dann  liest  das  Programm  den  Quelltext  ein  und  registiert  all  seine
  3262. Importe. Danach werden all die importierten Module gesucht, und zwar sowohl
  3263. die Code-Dateien von Definition und Implementation als auch die zugehörigen
  3264. Quelltexte.  Dabei  werden  Module  ignoriert,  deren  Definitions-Codes  in  der
  3265. unter den Compiler-Parametern eingetragenen Bibliotheks-Datei enthalten sind.
  3266. Das hat den Effekt, daß solche Module dann nicht mehr vom Make geprüft zu
  3267. werden brauchen, was bei den in der Bibliothek enthaltenen Megamax-Modulen
  3268. auch nicht mehr nötig ist, da ihre  Codes  sowohl  vorhanden  sind  als  auch
  3269. normalerweise nicht verändert werden.
  3270.  
  3271. Werden  Texte  von  Modulen  nicht  gefunden,  werden  sie  auch  nicht  in  der
  3272. Make-Datei  berücksichtigt,  zur  Sicherheit  erfolgt  aber  ein  Hinweis  vom
  3273. ModRef, daß es bestimmte Dateien nicht finden konnte. Wenn Sie vor dem
  3274. Start  von  ModRef  nur  bestimmte  Verzeichnisse  als  Suchpfade  für  die
  3275. Quelltexte eintragen (z.B. mit Hilfe von PathEdit), können Sie bequem Modul~
  3276. sammlungen für verschiedene Projekte auseinander halten.
  3277.  
  3278. Sind  alle  Importe  festgestellt,  erscheint  der  Datei-Selektor  von  Neuem.
  3279. Normalerweise ist nun Abbruch zu wählen, woraufhin eine Make-Datei erzeugt
  3280. wird, die den Namen des Hauptmoduls trägt, jedoch mit der Endung M2M. Die
  3281. Datei  wird  im  selben  Verzeichnis  abgelegt  in  der  auch  der  Quelltext  des
  3282. Hauptmoduls  steht.  Statt  des  Abbruchs  kann  auch  ein  weiteres  Modul
  3283. angewählt werden. Dann wird dieses Modul samt seiner Importe ebenfalls in
  3284. die Make-Datei aufgenommen. Damit wird erreicht, daß bei einem Make auch
  3285. zusätzliche zum Projekt gehörende Module gemaked werden können.
  3286. 2.7  Bedienung: Make und ModRef                                        2 - 72
  3287. ________________________________________________________
  3288.  
  3289.  
  3290. Wollen  Sie  gar  alle  Module  aus  einem  Verzeichnis  in  die  Make-Datei
  3291. aufnehmen,  können  Sie  den  Modulnamen  mit  Wildcards  eingeben,  also
  3292. beispielsweise *.M für alle Hauptmodule des Verzeichnisses.
  3293.  
  3294. Muß häufig die selbe Make-Datei neu erzeugt werden (s.u.), kann dies über
  3295. einen Batch vereinfacht werden: Schreiben Sie einen Batch, der die folgende
  3296. Zeile enthält:
  3297.   ModRef  <Quelltextnamen>
  3298. Melden Sie diese Textdatei (mit Endung M2B!) am besten als Tool an. Wird
  3299. dieser Batch ausgeführt, wird nicht mehr mit dem Datei-Selektor nach dem
  3300. Quelltextnamen gefragt, sondern der angegebene verwendet. Es können auch
  3301. mehrere  Textnamen  hintereinander  aufgeführt  werden,  um  dasselbe  zu
  3302. erreichen, wie durch die wiederholte Auswahl mit dem Datei-Selektor.
  3303.  
  3304. Es ist darauf zu achten, daß bei jeder Änderung der Import-Strukturen der
  3305. beteiligten  Module  die  Make-Datei  neu  erzeugt  wird!  Wird  dies  vergessen,
  3306. arbeitet das Make zwar meist einwandfrei, trotzdem zeigen sich beim Start
  3307. des Programms oft Fehler, wie beispielsweise Versionskonflikte.
  3308.  
  3309.  
  3310. Anwendung von Make
  3311.  
  3312. Das  Make-Programm  heißt  MM2Make  und  wird  in  den  Shell-Parametern
  3313. eingetragen. Der Aufruf erfolgt, indem eine Make-Datei  (Endung  M2M)  zur
  3314. Ausführung gebracht wird, indem sie also beispielsweise aus einem Fenster auf
  3315. das Ausführen-Symbol gezogen wird. Selbstverständlich können Make-Dateien
  3316. auch als Tool angemeldet sein.
  3317.  
  3318. Einen Sonderstatus genießt die Make-Datei, die als Default-Make eingetragen
  3319. ist (unter Info/Umgebung). Sie kann jederzeit durch die Taste M in der Shell
  3320. oder durch eine Sonderfunktion beim Verlassen der Editoren (siehe Kapitel 2.3)
  3321. aktiviert werden.
  3322.  
  3323. Bei  der  Aktivierung  des  Make  wird  zuerst  die  betroffene  Make-Datei
  3324. eingelesen,  dann  werden,  wie  oben  beschrieben,  die  Datumseinträge  der
  3325. Dateien geprüft. Am Ende wird eine Datei, die alle zu übersetzenden Texte
  3326. aufführt, unter dem Namen MAKE.M2C im temporären Pfad (einzustellen in
  3327. den Shell-Parametern) abspeichert. Sind keine Dateien zu übersetzen, liefert
  3328. MM2Make den ExitCode Eins, sonst Null. Daran erkennt die Shell dann, ob sie
  3329. daraufhin  den  Compiler  aufrufen  soll.  Der  übersetzt  dann  die  geforderten
  3330. Module alle auf einmal.
  3331.  
  3332. Zeigt das Make also den Fehler Ausgabedatei konnte nicht angelegt werden an,
  3333. liegt es meistens daran, daß der temporäre Pfad nicht auf ein vorhandenes,
  3334. beschreibbares Verzeichnis zeigt.
  3335. 2.7  Bedienung: Make und ModRef                                        2 - 73
  3336. ________________________________________________________
  3337.  
  3338.  
  3339. Stößt  der  Compiler  beim  Übersetzen  auf  einen  Fehler,  wird  der  Editor
  3340. gestartet, um ihn wie gewohnt anzuzeigen. Ist der Fehler korrigiert, kann das
  3341. Make fortgesetzt werden, indem der Editor mit dem Kommando zum Make
  3342. verlassen wird. In diesem Fall wird nicht das Default-Make sondern die aktive
  3343. Make-Datei wieder verwendet, mit der ein erneuter Make-Aufruf stattfindet.
  3344.  
  3345. Wird der Editor nach einem Fehler nicht mit dem Make-Kommando verlassen,
  3346. erinnert die Shell daran, daß der Make-Vorgang noch nicht abgeschlossen ist,
  3347. und bietet Ihnen an, diesen fortzuführen oder abzubrechen.
  3348.  
  3349. Sind syntaktische Fehler in der Make-Datei vorhanden, oder können benötigte
  3350. Dateien nicht gefunden werden, wird das Make abgebrochen und entweder die
  3351. Fehler auf dem Bildschirm angezeigt oder der Editor geladen, um dort den
  3352. Fehler in der Make-Datei anzuzeigen.
  3353.  
  3354.  
  3355. Alle Module unbedingt übersetzen (Build )
  3356.  
  3357. Wollen Sie alle Module einer Make-Datei unabhängig von ihrem Datum über~
  3358. setzen, können Sie dies dem Make-Programm durch Übergabe der Option "-B"
  3359. mitteilen. Entweder starten Sie das Make-Programm manuell (im Batch oder
  3360. durch Doppelklick) und übergeben in der Argumentzeile den Make-Dateinamen
  3361. zusammen mit -B oder Sie tragen -B hinter dem Namen der Make-Datei in
  3362. den Umgebungsinformationen ein. Das hat sogar den Vorteil, daß  das  "-B"
  3363. nach dem Make wieder daraus entfernt wird - denn einmal reicht's ja wohl.
  3364.  
  3365.  
  3366. Fehlermeldungen des Make
  3367.  
  3368. Zu wenig Speicher.
  3369.   Abhilfe: Residente Module/Programme entfernen.
  3370. Make-Datei ist leer.
  3371.   Die eingelesene Make-Datei enthält keine Daten
  3372. ... hat ungültiges Datum.
  3373.   Die Zeit der angezeigten Datei liegt hinter der aktuellen Zeit.
  3374. Dateifehler: ...
  3375.   Fehler beim Einlesen oder Anlegen der Datei.
  3376. Modul ist doppelt deklariert.
  3377.   Jedes Modul darf nur einmal in der Make-Datei deklatiert werden.
  3378. ... wurde nicht oder unvollständig deklariert.
  3379.   Das Modul ist bei IMPORT angebeben aber nicht deklariert.
  3380. Datei(en) nicht gefunden.
  3381.   Die Datei(en) sind nicht auf den entspr. Suchpfaden zu finden.
  3382. Ausgabedatei konnte nicht angelegt werden. (Stimmt "Temp.Pfad"?)
  3383.   Wahrscheinlich ist der Temp. Pfad in den Shell-Parametern ungültig.
  3384. Syntaxfehler.
  3385.   Wahrscheinlich wurde zuvor ein Semikolon bei einer Modulliste vergessen.
  3386. 2.7  Bedienung: Make und ModRef                                        2 - 74
  3387. ________________________________________________________
  3388.  
  3389.  
  3390. Syntax der Make-Dateien
  3391.  
  3392. moduldefinition =
  3393.   <modulname> ( -IGNORE | codedefinition )
  3394.  
  3395. codedefinition =
  3396.   ( -MOD | -IMP | -DEF ) <dateiname>
  3397.     -MAIN  
  3398.   ( -NOSRC | sourcedefinition )
  3399.  
  3400. sourcedefinition =
  3401.   -SOURCE <dateiname>
  3402.     -INC <dateiliste)  
  3403.     -USES <dateiliste)  
  3404.     -IMPORT <modulliste)  
  3405.  
  3406. dateiliste =
  3407.     dateiname   ";"
  3408.  
  3409. modulliste =
  3410.     modulname   ";"
  3411.  
  3412. Jedes in der Modulliste (nach -IMPORT) vorkommende  Modul  muß  definiert
  3413. sein! Wird es mit -IGNORE definiert, wird es vom Make ignoriert. Mit -INC
  3414. können Dateien bestimmt werden, die mittels der Include-Direktive mit in den
  3415. Modulsource eingebettet sind. Mit -USES können weitere abhängige Dateien,
  3416. z.B. Resource-Dateien, aufgeführt werden. -NOSRC besagt, daß der Quelltext
  3417. zu  diesem  Code  vom  Make  nicht  berücksichtigt  werden  soll.  Die  Kennung
  3418. -MAIN sollte nur bei einem Modul auftauchen.  Damit  wird  das  Hauptmodul
  3419. markiert, das nach einem erfolgreichen Make-Prozeß ggf. gestartet werden
  3420. kann.
  3421.